ScheduledExecutorService等待任务完成

时间:2013-11-25 16:07:58

标签: java scheduledexecutorservice

我正在创建一个新线程来检查新文件的文件夹,然后在指定的时间段内休眠。

我的偏好是使用ScheduledExecutorService,但是我找不到任何文档来澄清服务是否在开始新任务之前等待当前正在运行的任务完成。

例如,如果我有以下代码;

Integer samplingInterval = 30;
ScheduledExecutorService executorService = new ScheduledThreadPoolExecutor(10);
executorService.scheduleAtFixedRate(new WatchAgent(agentInfo), 0, samplingInterval, TimeUnit.SECONDS);

如果WatchAgent的run()花费超过30秒,是否会在完成之前创建新代理?

其次,如果我创建一个WatchAgent实例,我可以继续为每个定期运行使用相同的实例吗?

2 个答案:

答案 0 :(得分:4)

根据scheduleAtFixedRate的javadoc:

  

如果执行此任务的时间超过其周期,则后续执行可能会延迟,但不会同时执行。

根据定义,

scheduleAtFixedRate只需要一个Runnable个实例。您无法为run的每次调用提供不同的实例。因此,为了回答您的问题,每次定期运行将始终使用相同的实例。

答案 1 :(得分:3)

请尝试以下测试代码。

1)是的,似乎要等到run()完成。

2)是的,似乎它正在使用相同实例的run方法(当你调用scheduleAtFixedRate时传入的方法;这对btw来说非常有意义。)

import java.util.Date;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;


public class Test006 {

    public static void main(String[] args) {
        Object agentInfo = null;
        Integer samplingInterval = 30;
        ScheduledExecutorService executorService = new ScheduledThreadPoolExecutor(10);
        executorService.scheduleAtFixedRate(new WatchAgent(agentInfo), 0, samplingInterval, TimeUnit.SECONDS);
    }

}


class WatchAgent implements Runnable {

    public WatchAgent(Object info){

    }

    public void run(){
        try{
            System.out.println("Running " + this.hashCode() + " - started on/at " + (new Date()));
            Thread.sleep(60000);
            System.out.println("Running " + this.hashCode() + " - finished on/at " + (new Date()));
        }catch(Exception ex){
            ex.printStackTrace();
        }
    }
}