Java8 ScheduledExecutorService.scheduleAtFixedRate()
Java8 ScheduledExecutorService.scheduleAtFixedRate()
我正在读一本 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
If any execution of this task takes longer than its period, then
subsequent executions may start late, but will not concurrently
execute.
所以不要等待它并发执行,它总是顺序执行..
我正在读一本 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
If any execution of this task takes longer than its period, then subsequent executions may start late, but will not concurrently execute.
所以不要等待它并发执行,它总是顺序执行..