java - 在预定方法中运行 ExecutorService
问题描述
我有一个关于执行程序线程池的问题,在另一个线程池中运行。
假设我有带有预定方法的 Spring 服务,其他服务创建 ExecutorService 并运行一些操作方法
@Service
public class ScheduledService
{
@Autowired
WorkService workService;
@Scheduled(cron = "1 * * * * * ")
public void method() {
workService.execute();
}
}
@Service
public class WorkService {
private ExecutorService executorService = Executors.newFixedThreadPool(20);
public void execute() {
executorService.submit(()->action());
}
private void action() {
//some action
}
}
据我所知,@Scheduled 的默认池大小为 1。该池的内部线程我正在尝试使用更大的池创建新的 executorService。
所以问题是 - 执行将如何分布在 CPU 内核上,执行器服务真的会并行工作吗?我有一种感觉,它没有。我尝试在 2 个 vCore 和 4 个 vCore 机器上运行相同的作业,并且执行时间相同。
谢谢。
解决方案
它在 CPU 内核上的分布方式还取决于操作系统的繁忙程度,但让我们说没有其他事情发生,每个 CPU 内核都能够执行一个线程。如果活动线程多于 CPU 内核,则操作系统负责在线程之间分配 CPU 时间。
在您的示例中,一个线程将执行 @Scheduled 方法,这非常快,因为它不会做太多事情,只需向执行器服务提交一个新操作。
然后执行器服务(最多有 20 个线程)将在 20 个线程中的第一个可用线程上执行操作。
所以答案是肯定的,这些动作将并行完成。
您可以尝试经常安排您的方法,假设每秒:
@Scheduled(cron = "* * * ? * *")
然后在你的动作中做超过 1 秒的动作(否则动作将在下一个时间表之前完成)。您将看到并行执行该工作的操作。
顺便说一句,为什么不使用 ScheduledExecutorService ?或者配置spring使用多个线程?
推荐阅读
- r - 从具有多个时区 R 的字符向量中提取时间
- c - 为什么没有从这个二维数组打印连续的行?
- java - 将对象添加到 arrylist ArrayList
- javascript - 正确增加树枝值
- css - 为什么我的内联样式不适用于反应?
- c# - Acumatica:PXLongOperation 意外行为导致 UI 无异常崩溃
- c# - 如何使用不同类型的列表反序列化 JSON?
- vue.js - 如何在 vue 中通过 vue-i18n 使用每种语言的多个文件?
- python - 在 Jupyter Notebook 中,从另一个笔记本执行功能的最佳方式是什么?
- flutter - 带有 Flutter 的蓝牙 GATT 配置文件