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
需要一段时间,直到那时所有的任务都结束了。

有些任务没有执行并不令人吃惊(你在启动前关闭了池),但我不明白为什么所有的未来都还没有运行(那些只是没有被重新安排的期货)——为什么那些期货没有被取消(我试图在那里挂钩,只有一些被取消)。