我正在阅读一本java8书籍,并从scheduleAtFixedRate
中了解scheduleWithFixedDelay
和ScheduledExecutorService
方法之间的区别。
我了解这两种方法之间的区别,但是当我尝试编写简单的代码时。目前尚不清楚为什么scheduleAtFixedRate
同步行为。
如您所见,我正在池中分配100个线程。调度程序将每1ms提交一个新任务,每个任务的延迟为1s。
ScheduledExecutorService s = Executors.newScheduledThreadPool(100);
s.scheduleAtFixedRate(() -> {
int num = new Random().nextInt(100);
System.out.println("Hello World" + num);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Finished" + num);
}, 0, 1, TimeUnit.MILLISECONDS);
但是为什么我得到这个输出?新任务将仅在另一个任务之后运行。
Hello World94
Finished94
Hello World14
Finished14
Hello World90
Finished90
Hello World26
Finished26
最佳答案
看看 ScheduledThreadPoolExecutor#scheduleAtFixedRate
的javadoc
如果执行此任务所需的时间超过其期限,则
随后的执行可能会开始较晚,但不会同时执行
执行。
因此,不要等待它并发执行,它将始终按顺序执行。