Java ExecutorService.submit的确切行为是什么(就排队请求而言)?

Java ExecutorService.submit的确切行为是什么(就排队请求而言)?,java,executorservice,Java,Executorservice,我想使用一个使用单个线程的ExecutorService。现在我插入请求(通过提交)的速度比线程处理请求的速度要快。会发生什么 我特别想知道: 是否对排序有任何保证?任务是否会以完全相同的顺序执行 ExecutorService开始丢弃传入请求是否有(理论)限制 出于好奇:当服务使用线程池时会发生什么变化 (当然,我可以假设可能会使用一些队列;Oracle实现只是“做了正确的事情”;但我实际上想知道是否有一个真正的“规范”可以确定预期的行为)我想您是通过 创建一个执行器,该执行器使用在无界队

我想使用一个使用单个线程的
ExecutorService
。现在我插入请求(通过提交)的速度比线程处理请求的速度要快。会发生什么

我特别想知道:

  • 是否对排序有任何保证?任务是否会以完全相同的顺序执行
  • ExecutorService开始丢弃传入请求是否有(理论)限制
  • 出于好奇:当服务使用线程池时会发生什么变化

(当然,我可以假设可能会使用一些队列;Oracle实现只是“做了正确的事情”;但我实际上想知道是否有一个真正的“规范”可以确定预期的行为)

我想您是通过

创建一个执行器,该执行器使用在无界队列上运行的单个工作线程。(但是请注意,如果此单个线程在关机之前的执行过程中由于故障而终止,则在需要执行后续任务时,将替换一个新线程。)任务保证按顺序执行,并且在任何给定时间都不会有多个任务处于活动状态。与其他等效的newFixedThreadPool(1)不同,返回的执行器保证不可重新配置以使用其他线程

因此:

是否对排序有任何保证?任务是否会以完全相同的顺序执行

任务保证按顺序执行

ExecutorService开始丢弃传入请求是否有(理论)限制

在无界队列上运行。因此,尽可能大的内存/队列的后备存储将允许。通常
整数。最大值

出于好奇:当服务使用线程池时会发生什么变化


取决于您如何创建
ExecutorService
。如果愿意,可以使用有界队列创建,也可以使用不使用FIFO的队列创建(例如。的文档提供了不同选项的良好概述。

如果使用
执行器创建固定线程池
ExecutorService
。newFixedThreadPool(1);
(或
newSingleThreadExecutor()
)然后明确说明发生了什么


是否对排序有任何保证?任务是否会以完全相同的顺序执行

固定线程池使用
LinkedBlockingQueue
来保存挂起的任务。这样的队列实现FIFO策略(先进先出),因此执行顺序得到保证


ExecutorService开始丢弃传入请求是否有(理论)限制

引用Javadoc:

如果在所有线程都处于活动状态时提交其他任务,它们将在队列中等待,直到有线程可用

每个传入的请求都将添加到一个无界队列中,因此没有限制,也不会拒绝任何请求(因此理论限制为
Integer.MAX_VALUE


出于好奇:当服务使用线程池时会发生什么变化


如果您的意思是“如果固定线程池中有多个线程,则会发生什么变化”,则不会发生任何变化。队列仍将具有FIFO性质,并且对此队列没有限制。否则,这取决于您如何创建线程池。

无限队列=>受可用内存或队列最大大小的限制(通常为
整数.MAX_值
)。