线程池的分类
FixedThreadPool:
固定线程池:线程池中的线程数量固定,这些线程会一直存在,不会随任务的增 加或减少而动态调整,超出的任务会在队列中等待。
使用场景:任务量比较固定但耗时较长的任务。
CachedThreadPool:
缓存线程池:可根据需要创建新线程的线程池,如果新任务到达,但线程池中没有可用线程,则创建一个新线程并添加到池中,如果有被使用完但是还没销毁的线程,就复用该线程。线程池中超过60秒未使用的线程,将会被移除和销毁。
使用场景:任务量大但耗时少的任务
SingleThreadPool:
单线程池,使用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执 行。
使用场景:多个任务顺序执行(FIFO,优先级)。
WorkStealingPool:
工作窃取线程池,创建一个拥有多个任务队列(以便减少连接数)的线程池; 使用场景:会创建一个含有足够多线程的线程池,来维持相应的并行级别,它会通过工作窃取的方式,使得多核的 CPU 不会闲置,总会有活着的线程让 CPU 去运行。 如果当前工作线程处理完自己本地任务队列中的任务时,就会去全局队列或者其他工程线程的队列里面查找工作任务,帮助它们完成。 利用Work Staling,可以更好实现负载均衡。
ScheduledThreadPool
计划线程池(定时线程池,调度线程池)
使用场景:定时以及周期性执行任务。
线程池模式
线程池模式一般分为两种:L/F领导者与跟随者模式,HS/HA半同步/半异步模式。
领导者跟随者模式,在线程池中的线程可处在3种状态之一:领导者leader、追随者follower或工作者processor。任何时刻线程池只有一个领导者线程。事件到达时,领导者线程负责消息分离,并从处于追随者线程中选出一个来当继任领导者,然后将自身设置为工作者状态去处置该事件,处理完毕后工作者线程将自身的状态置为追随者。在ACE中,提供了领导者跟随者模式实现。
半同步/半异步模式又称为生产者消费者模式,是比较常见的实现方式,比较简单。分为同步层、队列层、异步层三层。同步层的主线程处理工作任务并存入工作队列,工作线程从工作队列取出任务进行处理,如果工作队列为空,则取不到任务的工作线程进入挂起状态。由于线程间有数据通信,因此不适于大数据量交换的场合。