天天看点

自己设计线程池,要从哪些方面考虑

1.高并发、任务执行时间段 的业务使用什么样的线程池

2.并发不高、任务执行时间长的的业务怎样使用线程池

3.并发搞、业务执行时间长的业务怎样使用线程池

线程池的本质是生产者和消费者模型,包括三要素:

  • 往线程队列中投递任务的生产者
  • 任务池队列
  • 从任务池队列取出任务执行的worker线程(消费者)

想要合理配置线程池的大小,就要分析线程池任务的特性,可以从以下几个方面进行分析:

根据任务性质分:

  • cpu密集型
  • IO密集型
  • 混合型任务

根据任务的优先级:

根据任务的执行时间:

不同性质的任务可以交给不同配置的线程池执行:

cpu密集型任务配置尽可能小的线程,如配置cpu个数+1个线程;IO密集型任务应配置尽可能多的线程,因为IO操作不占用cpu,不要让cpu闲下来,应加大线程的数量,如配置两倍cpu数量+1个线程;对于混合型的任务,如果可以拆分,拆换成IO密集型和cpu密集型分别处理,如果两种处理方式时间差距很大则没必要拆分。

如果任务执行时间长,在worker线程数量有限的情况下,worker很快就被任务占用,导致后续任务不能及时被处理,此时应增加worker线程数量;反过来,如果任务执行时间短,那么worker线程数量不用太多,太多的worker线程会导致过多的时间浪费在线程上下文切换上。

继续阅读