Java 该方法是如何实现的;“时间表固定日期”;类的ScheduledExecutorService工作?
我正在使用类Java 该方法是如何实现的;“时间表固定日期”;类的ScheduledExecutorService工作?,java,multithreading,concurrency,Java,Multithreading,Concurrency,我正在使用类ScheduledExecutorService的方法scheduleAtFixedRate尝试一个示例。代码是: ScheduledExecutorService service = Executors.newScheduledThreadPool(4); IntStream.range(0, 4).forEach(i -> service.scheduleAtFixedRate(() -> {try { System.out.p
ScheduledExecutorService
的方法scheduleAtFixedRate
尝试一个示例。代码是:
ScheduledExecutorService service = Executors.newScheduledThreadPool(4);
IntStream.range(0, 4).forEach(i -> service.scheduleAtFixedRate(() -> {try {
System.out.println(i + " task completed!");
} catch (Exception e) {
e.printStackTrace();
}},
0, 3, TimeUnit.SECONDS));
service.shutdown();
输出为:
1 task completed!
2 task completed!
0 task completed!
为什么不执行所有4个任务
如果我省略了service.shutdown()代码>然后所有任务都会重复执行,但这会导致内存泄漏。根据文件,应执行关机前的任何注册任务
此外,如果我使用Thread.sleep()
暂停当前线程
一段时间,则输出包含以下所有任务:
ScheduledExecutorService service = Executors.newScheduledThreadPool(4);
IntStream.range(0, 4).forEach(i -> service.scheduleAtFixedRate(() -> {try {
System.out.println(i + " task completed!");
} catch (Exception e) {
e.printStackTrace();
}},
0, 3, TimeUnit.SECONDS));
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
service.shutdown();
输出:
0 task completed!
3 task completed!
2 task completed!
1 task completed!
这是方法的预期行为吗
更新:
当我毫不延迟地使用submit
而不是scheduleAtFixedRate
时,行为接近预期。调用shutdownow()
可以完成所有4项任务,而shutdownNow()
只能完成3项:
ScheduledExecutorService service = Executors.newScheduledThreadPool(4);
IntStream.range(0, 4).forEach(i -> service.submit(() -> {
System.out.println(i + " task completed");}));
service.shutdown();
如果我不使用scheduledexecutorservice
,而是使用ExecutorService
:
ExecutorService service = Executors.newFixedThreadPool(4);
IntStream.range(0, 4).forEach(i -> service.submit(() -> {
System.out.println(i + " task completed");}));
service.shutdown();
然后,无论我使用shutdownNow()
的shutdownNow()
,所有4项任务都将始终完成
似乎ScheduledExecutorService
在任务提交上的行为有点不同,可能在shutdown()
和shutdownNow()
的ExecutorService.class文档中发现了这一点
此方法不会等待以前提交的任务完成
完成执行。使用{@link#等待终止等待终止}
这样做
查看此以了解更多信息。
在我的电脑上,我发现有时所有四个线程都完成了执行。它取决于调用shutdown
的时间。如果要等待线程完成,请使用waittermination
方法
当你让你的main
线程进入睡眠状态时,执行shutdown
需要一段时间,直到那时所有的任务都结束了。有些任务没有执行并不令人吃惊(你在启动前关闭了池),但我不明白为什么所有的未来都还没有运行(那些只是没有被重新安排的期货)——为什么那些期货没有被取消(我试图在那里挂钩,只有一些被取消)。