Java 如何使ThreadPoolExecutor具有无限队列,并且不会拒绝或超时队列中的任何任务
我只想在队列中插入一批任务,不想丢失任何一个任务。队列不应该丢弃作业;它只是在任何特定时间运行的线程数量有限。其余的作业将排队等待下一个可用线程作为其他线程退出 作业的执行顺序取决于您使用的队列;优先级队列、先进先出队列等。@virsir 您特别询问了创建实例Java 如何使ThreadPoolExecutor具有无限队列,并且不会拒绝或超时队列中的任何任务,java,multithreading,Java,Multithreading,我只想在队列中插入一批任务,不想丢失任何一个任务。队列不应该丢弃作业;它只是在任何特定时间运行的线程数量有限。其余的作业将排队等待下一个可用线程作为其他线程退出 作业的执行顺序取决于您使用的队列;优先级队列、先进先出队列等。@virsir 您特别询问了创建实例ThreadPoolExecutor。但是我想知道是否可以使用任何实现接口的类。由于ThreadPoolExecutor实现了ExecutorService,这并不是一个很大的飞跃 java.util.concurrent.Executor
ThreadPoolExecutor
。但是我想知道是否可以使用任何实现接口的类。由于ThreadPoolExecutor
实现了ExecutorService
,这并不是一个很大的飞跃
java.util.concurrent.Executors
类提供了一些有用的函数,用于创建处理某些常见情况的线程池
我最近在一个项目中使用它来创建几个不同的线程池。它返回一个实现ExecutorService的对象。我将数万个可运行实例提交到一个包含10个线程的池中时没有遇到任何问题,而且工作非常顺利
根据Java 5文档,此方法:
创建重用线程的线程池
固定的一组线程在一个线程上运行
共享无界队列。如果有的话
由于过程中的故障而终止
关机前执行,一个新的
如果需要,将取代它的位置
执行后续任务
由于该方法被称为创建“无界队列”,因此对可以提交的任务数量不应有人为限制。如果使用有界队列(
ArrayBlockingQueue
或有界LinkedBlockingQueue
),然后,提交任务可能会导致默认拒绝处理程序抛出RejectedExecutionException
。如果已经创建了最大数量的线程,并且所有线程都已满,则会发生这种情况。如果DiscardPolicy
或DiscardOldestPolicy
用作拒绝处理程序,显然提交可能会丢失。但总的来说,API开发人员似乎努力确保默认响应不会是无提示地丢失作业。这很好,但如果我需要对队列进行排序怎么办?因为我需要根据工作的优先级对工作进行排序。@MuhammadGelbana,这是一个有点不同的问题,答案更复杂。在web上查看或搜索“Java执行器优先级队列”。