ThreadPoolExecutor 队列满了和达到最大线程数时,线程阻塞往线程池了加数据
时间: 2023-07-07 09:46:52 浏览: 139
当ThreadPoolExecutor队列已满且达到最大线程数时,线程池的行为取决于其拒绝策略(RejectionPolicy)。如果拒绝策略是AbortPolicy,那么线程池将抛出RejectedExecutionException异常并拒绝该任务。如果拒绝策略是CallerRunsPolicy,那么执行任务的线程将被替换为调用execute方法的线程。如果拒绝策略是DiscardPolicy,则该任务将被默默地丢弃,不会有任何处理。如果拒绝策略是DiscardOldestPolicy,则将丢弃队列中最旧的未处理任务,并尝试重新提交当前任务。无论哪种拒绝策略,线程池都不会阻塞往线程池中加入数据。
相关问题
ThreadPoolExecutor线程池默认阻塞队列的大小
ThreadPoolExecutor线程池的默认阻塞队列大小为Integer.MAX_VALUE,即无界队列。这意味着当任务提交到线程池时,如果线程池的线程数已达到核心线程数(corePoolSize)的上限,而阻塞队列又未满,则任务会被添加到阻塞队列中等待执行。由于队列大小为无限大,所以不会造成任务被拒绝执行。当阻塞队列已满时,才会创建新的线程执行任务。
java ThreadPoolExecutor 队列
`ThreadPoolExecutor`是Java并发包中用于管理固定大小线程池的组件,它允许你创建一个线程池,并定义了任务的提交、执行以及资源的管理规则。队列(queue)在`ThreadPoolExecutor`中扮演着至关重要的角色,因为它存储待执行的任务,直到线程可用。
`ThreadPoolExecutor`支持多种队列策略,主要的有以下几种:
1. **ArrayBlockingQueue**:基于数组的有界阻塞队列,当队列满时,新任务会阻塞,直到其他任务完成并腾出空间。
2. **LinkedBlockingQueue**:基于链表的无界阻塞队列,任务的添加和移除操作都是O(1)时间复杂度,适合处理不确定的任务数量。
3. **PriorityBlockingQueue**:优先级队列,任务按照优先级排序,高优先级的任务优先执行。
4. **SynchronousQueue**:同步队列,没有容量,每次插入都会阻塞,直到有线程从队列移除,保证了任务的同步执行。
5. **DelayedWorkQueue**:用于延迟执行的任务队列,结合`DelayQueue`和`ThreadPoolExecutor`,适合执行延迟的任务。
6. 用户自定义`BlockingQueue`:如果你有自己的需求,还可以实现`BlockingQueue`接口并提供一个实例给`ThreadPoolExecutor`。
选择哪种队列取决于你的具体应用场景,比如任务是否需要按顺序执行、是否需要限制任务数量、是否关注任务优先级等。在配置`ThreadPoolExecutor`时,你需要指定`workQueue`参数来指定队列实现。
阅读全文