我正在读一本java8的书,发现了scheduleAtFixedRate
和ScheduledExecutorService
中的scheduleWithFixedDelay
方法之间的区别。
我明白这两种方法在书中的区别,但是当我试图写一个简单的代码时。目前还不太清楚为什么scheduleAtFixedRate
会使用synchronously.
如您所见,我在池中分配了100个线程。调度器将每1ms提交一个新任务,每个任务有1秒的延迟。
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
发布于 2019-05-27 00:41:34
看一看ScheduledThreadPoolExecutor#scheduleAtFixedRate
的javadoc
如果此任务的任何执行时间超过其周期,则后续执行可能会延迟开始,但不会并发执行。
因此,不要等待它并发执行,它将始终按顺序执行。
https://stackoverflow.com/questions/56315400
复制相似问题