使用 ScheduledThreadPool 并行执行

Using a ScheduledThreadPool with parallel execution

目前,我有一个每秒收集数据并将其发送到 API 端点的应用程序。为了每秒 运行,我使用 ScheduledThreadPoolExecutor 发送数据的线程 运行。问题是发送数据有时需要超过一秒,这会导致下一个数据序列要晚一秒以上才能收集到。有什么方法可以更改(或可以使用其他库),以便即使一个线程未完成发送数据,另一个线程也可以并行启动 运行ning?

假设您不关心 "API endpoint" 上的乱序调用,那么您可以创建 ScheduledThreadPoolExecutorcorePoolSize > 1。这样,每次调度程序启动它将使用池中的第一个可用线程。并且给定一个 corePoolSize > 1 你需要多次调用来花费超过 1 秒的时间才能 运行 线程不足。

对于其他上下文:ScheduledThreadPoolExecutor 有一个调度线程,用于检查任务,并在找到任务时将任务委托给其内部池中的工作线程。如果内部池只有一个线程(即 corePoolSize=1),那么所有任务都会连续执行,您不能保证每 _wait_period_ 执行一次任务(尽管您可以确定顺序)。如果你想坚持按计划执行任务 运行ning 并且你不关心顺序,那么你可以使用 corePoolSize 配置池,以确保 [=29] 中始终有可用线程=] 每次调度程序找到一个任务时池。

编辑 1:如果您使用的是 scheduleAtFixedRate,那么 是指将计划调用委托给单独的线程池。如果您采用这种方法,那么 corePoolSize=1 就足够了,因为 'worker' 线程只负责将任务委托给一个单独的池。

分离出数据收集和发送任务。 在单独的线程池(或调度的单线程)上收集数据并将数据提交到另一个工作是发布数据的池

处理同一计划任务重叠执行的通常方法是异步执行任务的(耗时)业务逻辑。

换句话说,当触发每秒一次的任务时,将实际工作提交给 ExecutorService(您用于计划任务的那个或另一个)。这样,计划任务在它再次执行之前就已经完成了它的工作(将实际工作排队)。