java - ScheduledExecutorService 没有创建并发线程
问题描述
我试图了解 ScheduledExecutorService 的工作原理。我写了这个简单的测试:
ScheduledExecutorService executorService = Executors.newScheduledThreadPool(10);
executorService.scheduleAtFixedRate(() -> {
try {
System.out.println("Test " + Thread.currentThread().getId());
Thread.sleep(10000);
System.out.println("End " + Thread.currentThread().getId());
} catch (Exception ex) {
}
}, 0, 100, TimeUnit.MILLISECONDS);
我在控制台上看到以下打印:
Test 19
End 19
Test 19
End 19
Test 21
End 21
等等。执行程序不应该在第一个线程结束之前安排并启动一个新线程吗?如果核心池大小为 10,为什么线程一个接一个地启动。不应该 10 个线程一起运行。
解决方案
重复任务是不重叠的,因此第一次调用需要在下一次调用开始之前完成:
通过 scheduleAtFixedRate 或 scheduleWithFixedDelay 计划的任务的连续执行不重叠。虽然不同的执行可能由不同的线程执行,但先前执行的影响发生在后续执行的影响之前。
如果此任务的任何执行时间超过其周期,则后续执行可能会延迟开始,但不会同时执行。
推荐阅读
- c# - 何时以及为什么在 c# 中使用别名或其类名?
- r - 如何将相关性或相似性表转换为 696x696 矩阵
- gmail - Gmail API:在一封邮件中发送文本和 HTML
- jquery - 物化 css:电子邮件和密码标签在浏览器自动填充上重叠
- button - AHK for Warcraft(非 MultiBox)2 按钮 - 非同时
- qt - XTestFakeKeyEvent 和 unicode(Qt 的问题)
- performance - IE 11 下载 http 响应缓慢
- android - putExtraData 在 Kotlin Intent 中做了什么?
- mysql - yii中没有主键的关系mysql表搜索(调用非整数字段)
- javascript - asp.net网格的javascript行数据比较