使用ScheduledThreadPool并行执行

时间:2017-08-22 16:48:17

标签: java threadpool threadpoolexecutor

目前,我有一个应用程序每秒收集数据并将其发送到API端点。要运行每一秒,我使用ScheduledThreadPoolExecutor来运行发送数据的线程。问题是发送数据有时需要一秒钟以上,这导致下一个数据集的收集时间超过一秒钟。有没有办法可以改变它(或者可以使用其他库),这样即使一个线程没有完成发送数据,另一个线程也可以开始并行运行?

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

假设您不关心" API端点上的无序调用"然后,您可以使用ScheduledThreadPoolExecutor>创建corePoolSize 1.这样,每次调度程序启动时,都将使用池中的第一个可用线程。给定corePoolSize> 1在你用完线程之前,你需要多次调用才能超过1秒。

对于其他上下文:ScheduledThreadPoolExecutor有一个调度线程,用于检查任务并找到一个任务,它将任务从其内部池委托给工作线程。如果内部池有一个线程(即corePoolSize=1),那么所有任务都会被执行,并且您不能保证每个_wait_period_都会执行任务(尽管您可以确定订购)。如果您希望坚持按计划运行任务而不关心订购,那么您可以使用corePoolSize配置池,以确保“工作人员”中始终有可用的线程。每次调度程序找到任务时都会使用池。

编辑1 :如果您使用的是scheduleAtFixedRate,则other answer指的是将计划的调用委派给单独的线程池是一种选择。如果您采用这种方法,那么corePoolSize=1就足够了,因为“工作人员”已经足够了。然后,线程只能将任务委派给一个单独的池。

答案 2 :(得分:1)

分离数据收集并发送任务。 在单独的线程池(或计划的单个线程)上收集数据,并将数据提交到其作业是要发布数据的另一个池