2017-06-09 44 views
1

我想每個毫秒的時間安排任務,並且我知道定時器,執行器等等。我發現這種方法是最準確的。但我只想知道我的方式對於一個(大)程序來說太重了嗎?使用Java線程作爲任務sheduler,

new Thread(() -> { 
     long time = System.currentTimeMillis(); 
     while (true) { 
      if (System.currentTimeMillis() - time >= 1000) { 
       // Scheduled task 
       System.out.println(new SimpleDateFormat("HH:mm:ss:SSS").format(new Date(System.currentTimeMillis()))); 
       time = System.currentTimeMillis(); 
      } 
     } 
    }).start(); 
+1

我不清楚你在問什麼。 – Todd

+0

我認爲while循環可以大量加載,我想在程序中經常使用這樣的調度器。 –

+2

您正在優化不需要優化的事物。使用Timer類,它容易理解100倍。 – Todd

回答

0

您的方法爲每個重複性任務創建一個新線程。每個線程都需要分配整個堆棧。因此,您的方法的內存消耗比需要的要大得多。如果您創建足夠的這些計時器線程,這可能會成爲問題。

如果你要有大量的這些任務,你最好使用java.util.Timer和TimerTasks。順便說一下,如書面所示,您的任務計時將會漂移,因爲在觸發任務和重置變量之間偶爾會有額外的毫秒或更多時間。不過,這可以在你的代碼中修復。

0

您的代碼有多個問題。

1.您的代碼持續執行,但它應該等待指定的時間,如果它沒有準備就緒。您可以使用延遲隊列或其他併發API可用,如果項目沒有準備好,它可能會等待或休眠,當項目準備就緒它會通知工作線程。

2.它是單線程的,如果它打破或一個任務需要很長時間,那麼它會逃脫下一個時間表。它不是邏輯上每30秒一個例子計劃。它是在執行完成後從它是計算。