具体流程如下:
1)当池子大小小于corePoolSize就新建线程,并处理请求
2)当池子大小等于corePoolSize,把请求放入workQueue中,池子里的空闲线程就去从workQueue中取任务并处理
3)当workQueue放不下新入的任务时,新建线程入池,并处理请求,如果池子大小撑到了maximumPoolSize就用RejectedExecutionHandler来做拒绝处理
4)另外,当池子的线程数大于corePoolSize的时候,多余的线程会等待keepAliveTime长的时间,如果无请求可处理就自行销毁
参考文章:http://blog.csdn.net/cutesource/article/details/6061229
自己写的测试代码
package com.asiainfo.ebiz.scheduler; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Random; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; public class ThreadPoolExecutorTest { private static SimpleDateFormat formatYear = new SimpleDateFormat("yyyyMMdd HH:mm:ss"); private static int count = 1; public static void main(String[] args) throws Exception { int poolSize = Runtime.getRuntime().availableProcessors() * 2; System.out.println("poolSize:"+poolSize); ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor( poolSize, poolSize, 5, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>()); System.out.println("初始化任务线程池成功。"); //循环创建线程 for(int i=1;i<100;i++){ threadPoolExecutor.execute(new Runnable() { @Override public void run() { Random r = new Random(); int a = (r.nextInt(5)+1)*1000; System.out.println("开启线程"+(count++)+",a="+a+",时间"+formatYear.format(new Date())); try { Thread.sleep(a); } catch (InterruptedException e) { e.printStackTrace(); } } }); } //shutdown 只是将空闲的线程interrupt() 了, 因此在shutdown()之前提交的任务可以继续执行直到结束。 threadPoolExecutor.shutdown(); while(true){ if(threadPoolExecutor.isTerminated()){ //如果关闭后所有任务都已完成,则返回 true。 break; } System.out.println("当期线程池任务线程数:" + threadPoolExecutor.getPoolSize()); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("线程全部执行结束。"); } }
api参考链接:http://tool.oschina.net/uploads/apidocs/jdk-zh/java/util/concurrent/ThreadPoolExecutor.html