2016-09-07 57 views
0

我有一個任務每20秒執行一次。但問題是,任務可能會延遲,從而導致中斷。如何檢查預定的線程是否完成了任務?

package client; 

import java.util.concurrent.ScheduledThreadPoolExecutor; 
import static java.util.concurrent.TimeUnit.*; 

import java.util.Date; 

public class Bootstrap 
{ 
    public static void main(String[] args) 
    { 
    addThreadsToPool(); 
    ServiceTest service1 = new ServiceTest(); 
    } 

    public static void addThreadsToPool() 
    { 
    ScheduledThreadPoolExecutor eventPool = new ScheduledThreadPoolExecutor(5); 

    eventPool.scheduleAtFixedRate(new Updater(), 2, 20, SECONDS); 

    try { 
     Thread.sleep(20000); 
    } catch (InterruptedException ignored) { 
    } 
    } 
} 

在這個例子中,類Updater每20秒執行一次,問題是如果updater的執行花費的時間超過20秒。 那麼如何讓Updater在下一次預定執行之前完成它的任務呢?

+1

如果你想_cancel_' Updater'如果還沒有完成,你可以使用'scheduleAtFixedRate'返回的'Future'並使'Updater'對取消非常敏感(注意中斷的狀態當前線程)。 –

+0

你會解釋更多的未來部分,如果updater沒有完成任務,我會取消更新並分配更多的時間來執行此任務的時間乘以一個因子? –

+0

您是否試圖確保2個'Updater'作業不能同時運行? – Gray

回答

0

除了編碼更新程序以使其在20秒內完成之外,沒有別的辦法。從嚴格的意義上講,這是不可能的,因爲一個線程可能會從CPU中調度出來,可能會發生長時間的GC暫停,等等。如果你在任務內部運行一個循環,它可以定期檢查時間並在到達截止日期時放棄。

相關問題