Java 如何使ThreadPoolExecutor具有无限队列,并且不会拒绝或超时队列中的任何任务

Java 如何使ThreadPoolExecutor具有无限队列,并且不会拒绝或超时队列中的任何任务,java,multithreading,Java,Multithreading,我只想在队列中插入一批任务,不想丢失任何一个任务。队列不应该丢弃作业;它只是在任何特定时间运行的线程数量有限。其余的作业将排队等待下一个可用线程作为其他线程退出 作业的执行顺序取决于您使用的队列;优先级队列、先进先出队列等。@virsir 您特别询问了创建实例ThreadPoolExecutor。但是我想知道是否可以使用任何实现接口的类。由于ThreadPoolExecutor实现了ExecutorService,这并不是一个很大的飞跃 java.util.concurrent.Executor

我只想在队列中插入一批任务,不想丢失任何一个任务。

队列不应该丢弃作业;它只是在任何特定时间运行的线程数量有限。其余的作业将排队等待下一个可用线程作为其他线程退出

作业的执行顺序取决于您使用的队列;优先级队列、先进先出队列等。

@virsir

您特别询问了创建实例
ThreadPoolExecutor
。但是我想知道是否可以使用任何实现接口的类。由于
ThreadPoolExecutor
实现了
ExecutorService
,这并不是一个很大的飞跃

java.util.concurrent.Executors
类提供了一些有用的函数,用于创建处理某些常见情况的线程池

我最近在一个项目中使用它来创建几个不同的线程池。它返回一个实现ExecutorService的对象。我将数万个可运行实例提交到一个包含10个线程的池中时没有遇到任何问题,而且工作非常顺利

根据Java 5文档,此方法:

创建重用线程的线程池 固定的一组线程在一个线程上运行 共享无界队列。如果有的话 由于过程中的故障而终止 关机前执行,一个新的 如果需要,将取代它的位置 执行后续任务


由于该方法被称为创建“无界队列”,因此对可以提交的任务数量不应有人为限制。

如果使用有界队列(
ArrayBlockingQueue
或有界
LinkedBlockingQueue
),然后,提交任务可能会导致默认拒绝处理程序抛出
RejectedExecutionException
。如果已经创建了最大数量的线程,并且所有线程都已满,则会发生这种情况。如果
DiscardPolicy
DiscardOldestPolicy
用作拒绝处理程序,显然提交可能会丢失。但总的来说,API开发人员似乎努力确保默认响应不会是无提示地丢失作业。这很好,但如果我需要对队列进行排序怎么办?因为我需要根据工作的优先级对工作进行排序。@MuhammadGelbana,这是一个有点不同的问题,答案更复杂。在web上查看或搜索“Java执行器优先级队列”。