网上介绍线程池的文章很多,质量好坏不一。能讲的很透彻的,确实不多。
本人能力有限,本文先从原理入手,讲清楚线程池是怎么运行的。
至于源码的分析,将单独写一篇(《线程池源码详解》)。
全文以 java 1.8 来说明。
一、示例代码
public static void main(String[] args) throws Exception {
ExecutorService pool = Executors.newFixedThreadPool(2);
for(int i =1; i <= 10; i++){
int index = i;
pool.execute(new Runnable() {
@Override
public void run() {
String currentThreadName = Thread.currentThread().getName();
log.info("第{}次任务结束,执行者:{}", index, currentThreadName);
}
});
}
pool.shutdown();
System.out.println("All thread is over");
}
这个小例子中,执行了10次 run() 方法,但其实只起了两个线程。
这就是线程池的一个特点:节省资源
线程的创建与销毁是非常耗能的操作,若执行一个任务就起一个线程,那是消耗大了去了。
二、线程池的创建
示例中,Executors.newFixedThreadPool(2)
,最终是执行的下面这个方法(是ThreadPoolExecutor
这个类中的方法)
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler) {
if (corePoolSize < 0 ||
maximumPoolSize <= 0 ||
maximumPoolSize < corePoolSize ||
keepAliveTime <