gpt4 book ai didi

java - ScheduledExecutorService类的方法 "scheduleAtFixedRate"是如何工作的?

转载 作者:行者123 更新时间:2023-12-01 06:08:27 25 4
gpt4 key购买 nike

我正在尝试使用 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() 将当前Thread暂停一段时间,那么输出将包含所有任务,如下所示:

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!

这是方法 scheduleAtFixedRate 的预期行为吗?

更新:

当我毫不延迟地使用 submit 而不是 scheduleAtFixedRate 时,行为接近预期。调用 shutdown() 可以完成所有 4 个任务,而 shutdownNow() 只能完成 3 个任务:

ScheduledExecutorService service = Executors.newScheduledThreadPool(4);
IntStream.range(0, 4).forEach(i -> service.submit(() -> {

System.out.println(i + " task completed");}));

service.shutdown();

如果我避免使用 ScheduledExcecutorService 并使用 ExecutorService 代替:

ExecutorService service = Executors.newFixedThreadPool(4);
IntStream.range(0, 4).forEach(i -> service.submit(() -> {

System.out.println(i + " task completed");}));

service.shutdown();

那么无论我使用 shutdown()shutdownNow(),所有 4 个任务总是完成。

似乎 ScheduledExecutorService 在任务提交上的行为有点不同,也许在 shutdown()shutdownNow() 上的行为有点不同。

最佳答案

在ExecutorService.class的文档中找到了这个

This method does not wait for previously submitted tasks to complete execution. Use {@link #awaitTermination awaitTermination} to do that.

检查这个Link了解更多信息。从我的电脑上我发现有时所有四个线程都会完成执行。这取决于调用 shudown 的时间。如果您想等待线程完成,请使用 awaitTermination 方法。

当您让main线程进入休眠状态时,需要一些时间来执行shutdown,直到那时所有任务都结束了。

关于java - ScheduledExecutorService类的方法 "scheduleAtFixedRate"是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39830306/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com