Java 使用具有并行执行的ScheduledThreadPool

Java 使用具有并行执行的ScheduledThreadPool,java,threadpool,threadpoolexecutor,Java,Threadpool,Threadpoolexecutor,目前,我有一个每秒收集数据并将其发送到API端点的应用程序。为了每秒运行一次,我使用了一个运行发送数据的线程的ScheduledThreadPoolExecutor。问题是发送数据有时需要一秒钟以上的时间,这会导致下一个数据序列在一秒钟以上收集。是否有任何方法可以更改(或使用其他库),以便即使一个线程没有完成数据发送,另一个线程也可以开始并行运行?假设您不担心“API端点”上的无序调用然后可以使用corePoolSize>1创建ScheduledThreadPoolExecutor。这样,每次调

目前,我有一个每秒收集数据并将其发送到API端点的应用程序。为了每秒运行一次,我使用了一个运行发送数据的线程的
ScheduledThreadPoolExecutor
。问题是发送数据有时需要一秒钟以上的时间,这会导致下一个数据序列在一秒钟以上收集。是否有任何方法可以更改(或使用其他库),以便即使一个线程没有完成数据发送,另一个线程也可以开始并行运行?

假设您不担心“API端点”上的无序调用然后可以使用
corePoolSize
>1创建
ScheduledThreadPoolExecutor
。这样,每次调度程序启动时,它都将使用池中的第一个可用线程。并且给定一个
corePoolSize
>1,在线程用完之前,您需要多次调用以花费1秒以上的时间

对于其他上下文:
ScheduledThreadPoolExecutor
具有一个调度线程,该线程检查任务,并在找到一个任务时将任务从其内部池委托给工作线程。如果内部池只有一个线程(即,
corePoolSize=1
),那么所有任务都是以串行方式执行的,并且您不能保证任务将在每个
\u等待\u期间执行(尽管您可以确定顺序)。如果您希望坚持按计划运行任务,并且不关心排序,则可以使用
corePoolSize
配置池,以确保每次调度器找到任务时“worker”池中始终存在可用线程


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

分离数据收集并发送任务。
在单独的线程池(或计划的单个线程)上收集数据,并将数据提交给另一个池,该池的任务是发布数据。处理重复执行同一计划任务的愿望的通常方法是异步执行任务的(耗时的)业务逻辑


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

我看了一下,但这是我在
scheduleAtFixedRate
的文档中看到的:“如果此任务的任何执行时间超过其周期,则后续执行可能会延迟开始,但不会同时执行。”这是一个问题,因为我无法等待任务完成。因此,我将调用数据收集(速度非常快)任务数据,并调用发送任务(时间更长)发送。是否认为“确定”“如果我有一个用于发送的执行器/池的全局变量,并在发送完成时直接通过数据计划发送,那么请进行练习。您可以
scheduleAtFixedRate
a任务。该任务可能会处理您的“数据”内容,然后提交一个单独的任务来“发送”该数据。换句话说,您将只有一个计划任务,每次执行时,您将得到一个独立执行的非计划任务。因此,关于提交,我是否可以防止出现无限排队?您可以控制这些任务排队和执行的所有方面。如果您愿意,您可以使用一个队列,当它达到您想要限制它的容量时,该队列将被阻塞。如果你在这方面有问题,你可能应该把它作为一个单独的问题来问,包括你正在努力实现的目标、你已经尝试了什么以及你的具体问题是什么。