标签:
线程类:
1 class RunThread implements Runnable{ 2 3 int Counter = 0; 4 @Override 5 public synchronized void run() { 6 7 try { 8 Thread.sleep(500); 9 } catch (InterruptedException e) { 10 e.printStackTrace(); 11 } 12 System.out.println(Thread.currentThread().getName()+"count:"+Counter++); 13 } 14 15 }
执行函数:
1 public static void main(String[] args) { 2 3 ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 10, 200, TimeUnit.MILLISECONDS, 4 new ArrayBlockingQueue<Runnable>(10)); 5 6 for (int i = 0; i < 15; i++) { 7 RunThread runThread = new RunThread(); 8 System.out.println("线程池中线程数目:"+executor.getPoolSize()+",队列中等待执行的任务数目:"+ 9 executor.getQueue().size()+",已执行玩别的任务数目:"+executor.getCompletedTaskCount()); 10 try { 11 executor.execute(runThread); 12 } catch (Exception e) { 13 e.printStackTrace(); 14 } 15 16 } 17 executor.shutdown(); 18 }
运行结果:
线程池中线程数目:0,队列中等待执行的任务数目:0,已执行玩别的任务数目:0 线程池中线程数目:1,队列中等待执行的任务数目:0,已执行玩别的任务数目:0 线程池中线程数目:2,队列中等待执行的任务数目:0,已执行玩别的任务数目:0 线程池中线程数目:3,队列中等待执行的任务数目:0,已执行玩别的任务数目:0 线程池中线程数目:4,队列中等待执行的任务数目:0,已执行玩别的任务数目:0 线程池中线程数目:5,队列中等待执行的任务数目:0,已执行玩别的任务数目:0 线程池中线程数目:5,队列中等待执行的任务数目:1,已执行玩别的任务数目:0 线程池中线程数目:5,队列中等待执行的任务数目:2,已执行玩别的任务数目:0 线程池中线程数目:5,队列中等待执行的任务数目:3,已执行玩别的任务数目:0 线程池中线程数目:5,队列中等待执行的任务数目:4,已执行玩别的任务数目:0 线程池中线程数目:5,队列中等待执行的任务数目:5,已执行玩别的任务数目:0 线程池中线程数目:5,队列中等待执行的任务数目:6,已执行玩别的任务数目:0 线程池中线程数目:5,队列中等待执行的任务数目:7,已执行玩别的任务数目:0 线程池中线程数目:5,队列中等待执行的任务数目:8,已执行玩别的任务数目:0 线程池中线程数目:5,队列中等待执行的任务数目:9,已执行玩别的任务数目:0 pool-1-thread-2count:0 pool-1-thread-4count:0 pool-1-thread-1count:0 pool-1-thread-3count:0 pool-1-thread-5count:0 pool-1-thread-4count:0 pool-1-thread-2count:0 pool-1-thread-1count:0 pool-1-thread-3count:0 pool-1-thread-5count:0 pool-1-thread-2count:0 pool-1-thread-4count:0 pool-1-thread-1count:0 pool-1-thread-5count:0 pool-1-thread-3count:0
修改参数:
new ThreadPoolExecutor(5, 10, 200, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<Runnable>(5));
输出结果:
线程池中线程数目:0,队列中等待执行的任务数目:0,已执行玩别的任务数目:0 线程池中线程数目:1,队列中等待执行的任务数目:0,已执行玩别的任务数目:0 线程池中线程数目:2,队列中等待执行的任务数目:0,已执行玩别的任务数目:0 线程池中线程数目:3,队列中等待执行的任务数目:0,已执行玩别的任务数目:0 线程池中线程数目:4,队列中等待执行的任务数目:0,已执行玩别的任务数目:0 线程池中线程数目:5,队列中等待执行的任务数目:0,已执行玩别的任务数目:0 线程池中线程数目:5,队列中等待执行的任务数目:1,已执行玩别的任务数目:0 线程池中线程数目:5,队列中等待执行的任务数目:2,已执行玩别的任务数目:0 线程池中线程数目:5,队列中等待执行的任务数目:3,已执行玩别的任务数目:0 线程池中线程数目:5,队列中等待执行的任务数目:4,已执行玩别的任务数目:0 线程池中线程数目:5,队列中等待执行的任务数目:5,已执行玩别的任务数目:0 线程池中线程数目:6,队列中等待执行的任务数目:5,已执行玩别的任务数目:0 线程池中线程数目:7,队列中等待执行的任务数目:5,已执行玩别的任务数目:0 线程池中线程数目:8,队列中等待执行的任务数目:5,已执行玩别的任务数目:0 线程池中线程数目:9,队列中等待执行的任务数目:5,已执行玩别的任务数目:0 pool-1-thread-4count:0 pool-1-thread-2count:0 pool-1-thread-5count:0 pool-1-thread-3count:0 pool-1-thread-1count:0 pool-1-thread-10count:0 pool-1-thread-9count:0 pool-1-thread-8count:0 pool-1-thread-7count:0 pool-1-thread-6count:0 pool-1-thread-4count:0 pool-1-thread-3count:0 pool-1-thread-5count:0 pool-1-thread-2count:0 pool-1-thread-1count:0
修改参数:
ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 8, 200, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<Runnable>(5));
输出结果:
线程池中线程数目:0,队列中等待执行的任务数目:0,已执行玩别的任务数目:0 线程池中线程数目:1,队列中等待执行的任务数目:0,已执行玩别的任务数目:0 线程池中线程数目:2,队列中等待执行的任务数目:0,已执行玩别的任务数目:0 线程池中线程数目:3,队列中等待执行的任务数目:0,已执行玩别的任务数目:0 线程池中线程数目:4,队列中等待执行的任务数目:0,已执行玩别的任务数目:0 线程池中线程数目:5,队列中等待执行的任务数目:0,已执行玩别的任务数目:0 线程池中线程数目:5,队列中等待执行的任务数目:1,已执行玩别的任务数目:0 线程池中线程数目:5,队列中等待执行的任务数目:2,已执行玩别的任务数目:0 线程池中线程数目:5,队列中等待执行的任务数目:3,已执行玩别的任务数目:0 线程池中线程数目:5,队列中等待执行的任务数目:4,已执行玩别的任务数目:0 线程池中线程数目:5,队列中等待执行的任务数目:5,已执行玩别的任务数目:0 线程池中线程数目:6,队列中等待执行的任务数目:5,已执行玩别的任务数目:0 线程池中线程数目:7,队列中等待执行的任务数目:5,已执行玩别的任务数目:0 线程池中线程数目:8,队列中等待执行的任务数目:5,已执行玩别的任务数目:0 java.util.concurrent.RejectedExecutionException: Task com.uestc.xst.RunThread@1884174 rejected from java.util.concurrent.ThreadPoolExecutor@814013[Running, pool size = 8, active threads = 8, queued tasks = 5, completed tasks = 0] at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.reject(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.execute(Unknown Source) at com.uestc.xst.Main.main(Main.java:73) java.util.concurrent.RejectedExecutionException: Task com.uestc.xst.RunThread@192c8d9 rejected from java.util.concurrent.ThreadPoolExecutor@814013[Running, pool size = 8, active threads = 8, queued tasks = 5, completed tasks = 0] at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.reject(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.execute(Unknown Source) at com.uestc.xst.Main.main(Main.java:73) 线程池中线程数目:8,队列中等待执行的任务数目:5,已执行玩别的任务数目:0 pool-1-thread-3count:0 pool-1-thread-1count:0 pool-1-thread-2count:0 pool-1-thread-4count:0 pool-1-thread-5count:0 pool-1-thread-7count:0 pool-1-thread-6count:0 pool-1-thread-8count:0 pool-1-thread-3count:0 pool-1-thread-2count:0 pool-1-thread-5count:0 pool-1-thread-4count:0 pool-1-thread-1count:0
继续修改参数:
ThreadPoolExecutor executor = new ThreadPoolExecutor(15, 25, 200, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<Runnable>(5));
输出结果:
线程池中线程数目:0,队列中等待执行的任务数目:0,已执行玩别的任务数目:0 线程池中线程数目:1,队列中等待执行的任务数目:0,已执行玩别的任务数目:0 线程池中线程数目:2,队列中等待执行的任务数目:0,已执行玩别的任务数目:0 线程池中线程数目:3,队列中等待执行的任务数目:0,已执行玩别的任务数目:0 线程池中线程数目:4,队列中等待执行的任务数目:0,已执行玩别的任务数目:0 线程池中线程数目:5,队列中等待执行的任务数目:0,已执行玩别的任务数目:0 线程池中线程数目:6,队列中等待执行的任务数目:0,已执行玩别的任务数目:0 线程池中线程数目:7,队列中等待执行的任务数目:0,已执行玩别的任务数目:0 线程池中线程数目:8,队列中等待执行的任务数目:0,已执行玩别的任务数目:0 线程池中线程数目:9,队列中等待执行的任务数目:0,已执行玩别的任务数目:0 线程池中线程数目:10,队列中等待执行的任务数目:0,已执行玩别的任务数目:0 线程池中线程数目:11,队列中等待执行的任务数目:0,已执行玩别的任务数目:0 线程池中线程数目:12,队列中等待执行的任务数目:0,已执行玩别的任务数目:0 线程池中线程数目:13,队列中等待执行的任务数目:0,已执行玩别的任务数目:0 线程池中线程数目:14,队列中等待执行的任务数目:0,已执行玩别的任务数目:0 pool-1-thread-1count:0 pool-1-thread-5count:0 pool-1-thread-3count:0 pool-1-thread-2count:0 pool-1-thread-4count:0 pool-1-thread-9count:0 pool-1-thread-7count:0 pool-1-thread-10count:0 pool-1-thread-8count:0 pool-1-thread-6count:0 pool-1-thread-11count:0 pool-1-thread-13count:0 pool-1-thread-14count:0 pool-1-thread-15count:0 pool-1-thread-12count:0
结果分析:
当线程池中线程大小达到核心线程上限时,如果还有线程开启,会优先放到任务缓存队列中,如果队列满了,则在MaximunPoolSize未满时,则开辟新的线程,如果MaximunPoolSize已满,则会抛出异常。
标签:
原文地址:http://www.cnblogs.com/centor/p/5740737.html