我有兴趣使用ScheduledExecutorService
为任务产生多个线程,前提是任务尚未完成。例如,我需要每0.5秒处理一个文件。第一个任务开始处理文件,在0.5s之后,如果第一个线程没有完成,第二个线程被产生并且开始处理第二个文件,等等。这可以通过像这样做:ScheduledExecutorService多个并行线程
ScheduledExecutorService executor = Executors.newScheduledThreadPool(4)
while (!executor.isShutdown()) {
executor.execute(task);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// handle
}
}
现在我的问题:为什么我不能executor.scheduleAtFixedRate
做呢?
我得到的是,如果第一个任务花费更长时间,第二个任务将在第一个完成时立即启动,但即使执行程序具有线程池,也不会启动新线程。 executor.scheduleWithFixedDelay
很清楚 - 它执行的任务在它们之间具有相同的时间跨度,并且完成任务需要多长时间无关紧要。所以可能我误解了ScheduledExecutorService
的目的。
也许我应该看看另一种执行者?或者只是使用我在这里发布的代码?有什么想法吗?
您链接到scheduleAtFixedRate方法和javadoc指出:“如果这个任务的任何执行比其周期需要更长的时间,那么随后的执行中可能起步晚,但不会同时执行。”这就是它的工作原理,当我尝试... scheduleWithFixedDelay也不适合,因为它开始计算第一个任务结束后的延迟。而线程池的大小并不重要。这对我来说很奇怪,ScheduledExecutorService没有并行执行的方法,或者我错过或误解了某些东西,这就是为什么林问:) – nesvarbu
哦,我明白了。我错过了。我想这个问题会是:“如果你想一次执行其中的两个,他们真的是同样的任务吗?”如果你确信它们是,那么我认为java.util.concurrent可能不支持这种特殊用法。 –