Java并发 -- Worker Thread模式
Worker Thread模式
- Worker Thread模式可以类比现实世界里车间的工作模式,Worker Thread对应车间里的工人(人数确定)
- 用阻塞队列做任务池,然后创建固定数量的线程消费阻塞队列中的任务 – 这就是Java中的线程池方案
echo服务
1 | private ExecutorService pool = Executors.newFixedThreadPool(500); |
正确地创建线程池
- Java线程池既能避免无限制地创建线程导致OOM,也能避免无限制地接收任务导致OOM(有界队列)
- 当请求量大于有界队列的容量时,应该合理地拒绝请求,在创建线程池时,应该清晰地指明拒绝策略
- 为了便于调试和诊断问题,在实际工作中应该给线程赋予一个业务相关的命名
1 | private ExecutorService pool = new ThreadPoolExecutor(50, 500, 60L, TimeUnit.SECONDS, |
避免线程死锁
- 如果提交到相同线程池的任务不是相互独立的,而是有依赖关系的,有可能会导致线程死锁
- 通用解决方案:为不同的任务创建不同的线程池,提交到相同线程池中的任务一定是相互独立的
- 下图中第一阶段的任务会等待第二阶段的子任务完成
1 | // L1、L2阶段共用线程池 |
jstack
1 | // 阻塞在l2.await() |
对比Thread-Per-Message模式
- Thread-Per-Message模式:主线程直接创建子线程,主子线程之间可以直接通信
- Worker Thread模式:主线程提交任务到线程池,但主线程并不关心任务被哪个线程执行
- 能够避免线程频繁创建、销毁的问题,并且能够限制线程的最大数量
- Java利用Worker Thread模式来实现线程池
参考资料
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.