Java线程池原理解析( 二 )


内部实现:new ThreadPoolExecutor(0,Integer.MAX_VALUE,60L,TimeUnit.SECONDS,new SynchronousQueue<runnable>());</runnable>
2. Executors.newFixedThreadPool(int);
说明: 创建一个定长线程池 , 可控制线程最大并发数 , 超出的线程会在队列中等待 。
内部实现:new ThreadPoolExecutor(nThreads, nThreads,0L,TimeUnit.MILLISECONDS,new LinkedBlockingQueue<runnable>());</runnable>
3. Executors.newSingleThreadExecutor();
说明:创建一个单线程化的线程池 , 它只会用唯一的工作线程来执行任务 , 保证所有任务按照顺序执行 。
内部实现:new ThreadPoolExecutor(1,1,0L,TimeUnit.MILLISECONDS,new LinkedBlockingQueue<runnable>())</runnable>
4. Executors.newScheduledThreadPool(int);
说明:创建一个定长线程池 , 支持定时及周期性任务执行 。
内部实现:new ScheduledThreadPoolExecutor(corePoolSize)
【附】阿里巴巴JAVA开发手册中对线程池的使用规范

  1. 【强制】创建线程或线程池时请指定有意义的线程名称 , 方便出错时回溯 。
    正例:
public class TimerTaskThread extends Thread {public TimerTaskThread(){super.setName("TimerTaskThread");...}}【Java线程池原理解析】2.【强制】线程资源必须通过线程池提供 , 不允许在应用中自行显式创建线程 。
说明: 使用线程池的好处是减少在创建和销毁线程上所花的时间以及系统资源的开销 , 解决资
源不足的问题 。如果不使用线程池 , 有可能造成系统创建大量同类线程而导致消耗完内存或者
“过度切换”的问题 。
3.【强制】线程池不允许使用 Executors 去创建 , 而是通过 ThreadPoolExecutor 的方式 , 这样
的处理方式让写的同学更加明确线程池的运行规则 , 规避资源耗尽的风险 。
说明: Executors 返回的线程池对象的弊端如下:
1) FixedThreadPool 和 SingleThreadPool:
允许的请求队列长度为 Integer.MAX_VALUE , 可能会堆积大量的请求 , 从而导致 OOM 。
2) CachedThreadPool 和 ScheduledThreadPool:
允许的创建线程数量为 Integer.MAX_VALUE ,  可能会创建大量的线程 , 从而导致 OOM 。
6. 总结
ThreadPoolExecutor通过几个核心参数来定义不同类型的线程池 , 适用于不同的使用场景;其中在任务提交时 , 会依次判断corePoolSize ,  workQueque ,  及maximumPoolSize , 不同的状态不同的处理 。技术领域水太深 , 如果不是日常使用 , 基本一段时间后某些知识点就忘的差不多了 , 因此阶段性地回顾与总结 , 对夯实自己的技术基础很有必要 。




推荐阅读