2016-09-07 58 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暂停,等等。如果你在任务内部运行一个循环,它可以定期检查时间并在到达截止日期时放弃。

相关问题