2012-05-22 48 views
1
for(int i = 1; i < 10000; i++) { 
Command nextCommand = getNextCommandToExecute(); 
} 

我想運行上述程序60分鐘。所以,而不是循環我需要做類似的東西 -針對特定的時間運行Java

long startTime = System.nanoTime(); 

    do{ 
    Command nextCommand = getNextCommandToExecute(); 
    } while (durationOfTime is 60 minutes); 

但我不知道,我應該如何使此程序運行60分鐘。

+0

讓它成爲一個線程。 – jn1kk

+0

你能通過使用ThreadPoolExecutor向我展示一個例子嗎? – AKIWEB

+0

只是在每個條件測試之前計算從開始和當前時間的差異。 – usoban

回答

1

嘗試以下方法:用這種方法

long startTime = System.currentTimeMillis(); 
long endTime = startTime + (60*60*1000); 

while(System.currentTimeMillis() <= endTime) { 
    Command nextCommand = getNextCommandToExecute(); 
} 

一個缺點是,如果你Command正在努力執行跑過60分鐘定時器或無法完成的。如果這種行爲不被允許,你最好實現一個線程來中斷任何線程運行這個循環。

+0

就像我對另一個人說的那樣 - 「如果這是一項連續任務呢?如果有任務完成,你將不會得到控制權」 – jn1kk

+0

@skynorth謝謝!在編輯中解決。取決於該計劃的其他要求,可能會或可能不會成爲該操作的問題。 –

4

推出即睡60分鐘,然後退出後臺線程:

Runnable r = new Runnable() { 
    @Override 
    public void run() { 
     try { 
      Thread.sleep(60 * 60 * 1000L); 
     } 
     catch (InterruptedException e) { 
      // ignore: we'll exit anyway 
     } 
     System.exit(0); 
    } 
} 
new Thread(r).start(); 
<your original code here> 
+0

所以在這裏我將執行我的命令,就好像你看我的例子一樣,我需要執行一些任務,60分鐘後,我想停止程序。 – AKIWEB

+0

看我的編輯。您在執行原始代碼之前啓動線程。 –

+0

請注意,使用這種方法你的最終命令可能會在執行過程中被殺死。如果你分析任何輸出,你可能會想省略最後一條命令,因爲它會不完整。 – Thomas

2
long startTime = System.currentTimeMillis(); 
do 
{ 
    //stuff 
} while (System.currentTimeMillis() - startTime < 1000*60*60); 
+0

就像我對另一個人說的那樣 - 「如果這是一項持續的任務會怎麼樣?直到任務完成後纔會得到控制,如果有的話」 – jn1kk

0

你可以使用:

long startTime = System.nanoTime(); 
do { 
    Command nextCommand = getNextCommandToExecute(); 
} while ((System.nanoTime() - startTime) < 60 * 60 * 1000000000L); 

請注意:System.nanoTime()是不僅在使用System.currentTimeMillis()略有不同規模,但也在它的措施:System.nanoTime()是流逝的時間,而System.currentTimeMillis()是系統時間(掛鐘)。如果系統時間改變,System.currentTimeMillis()不能按預期工作。 (但這不適用於夏季變化,因爲返回值爲UTC/GMT。)

1000000000L納秒爲一秒。請注意0​​爲long。在Java 7中,您還可以編寫更易讀的1_000_000_000L

+0

就像我對另一個人說的那樣 - 「如果是一個人連續任務?直到任務完成後,您將不會得到控制權,如果有的話「 – jn1kk

+0

也許getNextCommandToExecute()被阻塞,所以如果沒有命令,程序將不會關閉。另外一個空的無限循環是不好的主意。嘗試在後臺線程中使用'Thread.sleep(60 * 60000L)' – alaster

+1

上面的代碼是原始問題的答案。這個問題(至少最初)不是關於在後臺創建新線程或執行某些事情,還是關於如果getNextCommandToExecute()阻止或不阻止。 –

0
long startTime = System.currentTimeMillis(); 

do{ 
Command nextCommand = getNextCommandToExecute(); 
}while (startTime < startTime+60*60*1000);