一、线程池技术
一个线程池包括以下四个基本组成部分:
- ThreadPool(线程池管理器):用于创建并管理线程池;
- PoolWorker(工作线程):线程池中的线程,没有任务时处于等待状态;可以循环执行任务;
- Task(任务接口):每个任务必须实现的接口,以便工作线程调度任务的执行;
- taskQueue(任务队列):用于存放处于等待的工作线程任务;
二、ForkJoinPool
ForkJoinPool是JDK7引入的线程池。它的核心思想是将大任务分解成多个小任务(fork),由线程池分别执行每个小任务,等待小任务都执行完之后再把它们的结果汇总起来(join)作为大任务的结果。同时它也提供了基本的线程池功能,支持设置最大并发线程数,支持任务缓存等待,支持线程池停止,支持线程池使用情况监控等。也是AbstractExecutorService的子类,引入了“工作窃取”机制,在多CPU计算机上处理性能更佳。
work-stealing(工作窃取机制)
工作窃取机制是ForkJoinPool提供的一个更有效的利用线程的机制,当ThreadPoolExecutor还在用单个队列存放任务时,ForkJoinPool已经分配了与线程数相等的队列,当有任务加入线程池时,会被平均分配到对应的队列上,各线程进行正常工作,当有线程提