当前位置: 首页 > 知识库问答 >
问题:

在计划方法内运行ExecutorService

潘胤
2023-03-14

我有一个关于执行器线程池的问题,一个在另一个里面运行。

假设我有一个带有调度方法的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
    }
}

据我所知,默认情况下@调度的池大小为1。在此池中的线程内,我正在尝试创建具有更大池的新执行器服务。

所以问题是——执行将如何分布在CPU核上,执行器服务真的能并行工作吗?我有一种感觉,事实并非如此。我尝试在2个vCores和4个vCores机器上运行相同的作业,执行时间相同。

谢谢

共有1个答案

西门淮晨
2023-03-14

它在CPU核上的分布方式也取决于操作系统的繁忙程度,但假设没有其他情况发生,每个CPU核都能够执行一个线程。如果活动线程多于CPU内核,则操作系统负责在线程之间分配CPU时间。

在您的示例中,一个线程将执行@Scheduled方法,该方法速度非常快,因为它做的不多,只需向executor服务提交一个新操作即可。

然后,最多有20个线程的执行器服务将在20个线程中的第一个可用线程上执行操作。

所以答案是肯定的,这些行动将并行进行。

您可以经常安排您的方法,比如说每秒钟:

@Scheduled(cron = "* * * ? * *")

然后在行动中做一些超过1秒的事情(否则行动将在下一个计划之前完成)。您将看到并行执行的操作。

顺便问一下,为什么不使用SchduledExecutorService?或者配置Spring以使用多个线程?

 类似资料:
  • 关于Java定时器类或ScheduledExecutorService接口,我可以在执行器线程(其他调度器)的运行方法(或TimerTask)内设置调度器(或定时器)吗? 案例研究:我有一个数据库,其中包含歌曲列表(10000首)和播放歌曲的时间表。 所以我想创建一个调度程序(比如1)(周期为1小时),它将搜索数据库,并为计划在一小时内播放的所有歌曲创建调度程序。 一小时后,scheduler1将

  • 本文向大家介绍JavaScript计划任务后台运行的方法,包括了JavaScript计划任务后台运行的方法的使用技巧和注意事项,需要的朋友参考一下 即使忘了 JavaScript 的一切知识,也不会忘记:它是阻塞的。 想象一下,你的浏览器里住着一个魔法小精灵,负责浏览器的正常运转。不论渲染 HTML,响应菜单命令,屏幕渲染,处理鼠标点击,或者执行 JavaScript 函数,所有事情都归一个小精灵

  • > 我需要在执行前一个任务后以不同的延迟一个接一个地运行计划的任务。示例。有一个任务列表和延迟列表。 现在我需要运行task1通过100ms,task2在task1之后通过9ms,task3在task2之后通过22ms等等。 我正在使用javafx。任务可以使用一些UI更新方法,例如更改节点位置。这迫使我使用平台。runLater()方法,因为如果不这样做,则会出现异常“Not on FX app

  • 我有一套使用spring框架用Java写的服务。一些服务有预定的任务(使用spring的< code>@Scheduled注释)来做一些内务处理(生成处理过的数据,数据清理等。).由于这些计划任务,我不能运行服务的多个实例,因为所有实例都选择相同的任务,并且多次执行,导致重复/损坏的数据。为了解决这个问题,我想在任务执行时进行检查,并且只允许在一个实例上执行。我该怎么做?这个问题有更好的解决方法吗

  • 我正在尝试用ECS Fargate设置一个计划的任务,但我不知道为什么它没有运行。我可以使用确认任务正常工作,但当我试图按计划触发它时,得到的只是一堆没有任何解释的'failedinvocations'。 虽然我知道规则正在被触发,所以这是一个好的迹象。见下方截图: 但每次触发它时,只有一个“FailedInvocation”。安排规则如下: 谢谢 编辑:区域现在支持此操作。请参阅备注。

  • 你好,我有我的应用程序部署在Heroku免费计划,这里的主要限制是应用程序空闲时没有使用,这是这个话题的线索。 假设我想要一个带有注释的代码在每天凌晨3点执行,但很可能我的应用程序此时处于空闲/睡眠状态。问题是,这个方法是否会运行,并不知何故知道它需要从睡眠中醒来,并在特定时间运行一个方法? 如果没有,你会建议什么解决方法? 提前谢谢!