2014-12-10 90 views
0

我爲我的系統創建了一個Timer(java.util)管理器。我想每1秒執行一次。我已經試過這樣:運行時發生定時器每1秒重複

public class GlobalManager extends Timer { 

public static GlobalManager manager; 
public static ConcurrentLinkedDeque<Manageable> datas = new ConcurrentLinkedDeque<>(); 

public GlobalManager() { 
    Thread.currentThread().setName("GlobalManager"); 
    this.scheduleAtFixedRate(new TaskExecutor(), 0, 1000); 

} 

/* Manage the data in the waiting queue.. */ 
public static class TaskExecutor extends TimerTask { 
    @Override 
    public void run() { 
     System.out.println(datas.size()); 
     for(Manageable data : datas) { 
      if((System.currentTimeMillis() - data.startTime) >= data.delay) { 
       data.run(); 

       if(data.removeAfterRun) 
        datas.remove(data); 
      } 
     } 
    } 
} 

}

的問題。它每1秒打印出一行數據的大小。 執行data.run()時,它不會每隔1秒繼續打印一次,而是等待下一次打印的相當長的時間。

爲什麼?

+0

需要多少時間才能遍歷'datas'中的所有內容並運行需要的內容?我不相信計劃的任務將在當前計劃完成之前運行,因此如果處理數據所需時間超過1秒,則您的下一個任務將不會按時執行。 – azurefrog 2014-12-10 22:09:33

+0

你的跑步方法有多久和艱難?把它放在一個線程中,但如果它們不能在同一時間運行,那麼你的運氣不好使 – 2014-12-10 22:09:43

+0

你是直接執行run()方法嗎? (你不應該) – 2014-12-10 22:09:58

回答

0

需要多少費用data.run
計時器不是用來處理大量的未定義運行時間的同步工作。
您可以改爲使用計時器運行方法啓動「工作者」線程。

以下示例顯示內部運行時間如何影響定期調用之間的時間。

package test.threads; 

import java.io.IOException; 
import java.util.Timer; 
import java.util.TimerTask; 

public class TimerTest extends Timer { 
    public static void main(String[] args) throws IOException { 
     new TimerTest().startTimer(); 
    } 

    private void startTimer() { 
     this.scheduleAtFixedRate(new TaskExecutor(), 0, 1000); 
    } 

    public static class TaskExecutor extends TimerTask { 
     @Override 
     public void run() { 
      try { 
       Thread.sleep(2000);//<-- Increases the rate to at least 2 seconds 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      System.out.println(System.currentTimeMillis()); 
     } 
    } 
} 
0

謝謝您的回答,但我已經看到了,我不能使用此解決方案,因爲我需要喲檢查我的所有數據每隔1秒計算有多少時間開始,所以我必須找執行人並用兩個全局變量,一個用Executer.schedulerThreadPool(5);和newSingleThreadExecutor 他們在11小時以上運行ont問題或+

它是我找到的最佳解決方案。 問題解決了