5

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

我的偏好是使用 ScheduledExecutorService,但是,我找不到任何文档来说明这是否等待当前正在运行的任务完成后再开始新的任务。

例如,在下面的代码中;

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

如果run()ofWatchAgent时间超过 30 秒,是否会在完成之前创建一个新代理?

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

4

2 回答 2

6

根据scheduleAtFixedRate的javadoc :

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

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

于 2013-11-25T16:16:41.303 回答
4

试试下面的这个测试代码。

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

2) 是的,似乎它使用的是同一个实例的 run 方法(您在调用 scheduleAtFixedRate 时传入的方法;顺便说一句,这很有意义)。

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();
        }
    }
}

输出:

Running 1322575120 - started on/at Mon Jul 08 19:58:41 IST 2019
Running 1322575120 - finished on/at Mon Jul 08 19:59:41 IST 2019
Running 1322575120 - started on/at Mon Jul 08 19:59:41 IST 2019
Running 1322575120 - finished on/at Mon Jul 08 20:00:41 IST 2019
Running 1322575120 - started on/at Mon Jul 08 20:00:41 IST 2019
...
于 2013-11-25T16:19:04.207 回答