使用场景:如定时任务批处理时,将分批任务用多线程进行处理,生成者主线程会快速创建任务,消费者无法及时处理完,希望生产者等待消费者消费后继续添加任务。
背景:当线程池任务满时,线程池的4种默认策略都是不阻塞的生产线程的,当
new ThreadPoolExecutor.CallerRunsPolicy() // 表示将提交的任务交给提交的人让它自己租处理。
new ThreadPoolExecutor.AbortPolicy() // 表示用抛异常的方式来拒绝执行提交的任务。
new ThreadPoolExecutor.DiscardPolicy() // 表示,直接把提交的任务抛弃掉.
new ThreadPoolExecutor.DiscardOldestPolicy() //表示丢弃掉时间最久的任务,并执行当前的任务。
关键点:自定义阻塞策略
new RejectedExecutionHandler() {
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
if (!executor.isShutdown()) {
try {
executor.getQueue().put(r);
} catch (InterruptedException e) {
e.printStackTrace();
Thread.currentThread().interrupt();
}
}
}
}
完整的测试代码
package com.yuanb

本文介绍了在Java多线程中,如何创建一个线程池,当任务生产者速度超过消费者时,线程池能够阻塞生产者,等待消费者完成任务后再继续添加任务。通过自定义阻塞策略,当线程池达到最大容量时,主线程会被阻塞,直到子线程完成任务。示例代码展示了这种阻塞线程池的工作流程。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



