工作线程(Worker Thread)
- 定义:让有限的工作线程,轮流异步处理无限多的任务
- 最常见的就是线程池,其也体现了享元模式
- 注意:不同任务类型应当使用不同的线程池,这样可以避免饥饿,提升效率
饥饿现象
- 固定大小的线程池会有饥饿现象
- 假定一种两阶段的任务,共有两个线程处理。
- 整个任务执行过程中,线程1在第一阶段执行时,必须等线程2第二阶段执行完毕才能同时结束两个线程
- 若此时只来了一个任务,可以两个线程分别执行一个阶段
- 但是如果同时来了两个任务,线程1执行任务1的阶段1,线程2执行任务2的阶段1,则此时没有多余线程去执行任务1和任务2的阶段2,此时线程1和2就没有办法得到释放
- 举个生动的例子:
- 饥饿问题的解决:
- 将两个阶段使用两个不同的线程池即可
- 调优:
- 1、对于CPU使用密集型的任务来说,线程数设为cpu核数+1
- 2、对于IO密集型任务来说,线程数=cpu核数X期望CPU使用率/CPU实际使用率