public class ThreadPoolTest2 {
public static void main(String[] args) {
ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 10, 200, TimeUnit.MILLISECONDS,
new ArrayBlockingQueue<Runnable>(5));
for (int i = 0; i < 15; i++) {
MyTask myTask = new MyTask(i);
executor.execute(myTask);
System.out.println(
"线程池中线程数目:" + executor.getPoolSize() + ",队列中等待执行的任务数目:" + executor.getQueue()
.size() + ",已执行完毕的任务数目:" + executor.getCompletedTaskCount());
}
//不会立即终止线程池,而是要等所有任务缓存队列中的任务都执行完后才终止,但再也不会接受新的任务
executor.shutdown();
}
static class MyTask implements Runnable {
private int taskNum;
public MyTask(int num) {
this.taskNum = num;
}
@Override public void run() {
System.out.println("正在执行task " + taskNum);
try {
Thread.currentThread().sleep(4000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("task " + taskNum + "执行完毕");
}
}
//运行结果
// 正在执行task 0
// 线程池中线程数目:1,队列中等待执行的任务数目:0,已执行玩别的任务数目:0
// 线程池中线程数目:2,队列中等待执行的任务数目:0,已执行玩别的任务数目:0
// 正在执行task 1
// 线程池中线程数目:3,队列中等待执行的任务数目:0,已执行玩别的任务数目:0
// 正在执行task 2
// 线程池中线程数目:4,队列中等待执行的任务数目:0,已执行玩别的任务数目:0
// 正在执行task 3
// 线程池中线程数目:5,队列中等待执行的任务数目:0,已执行玩别的任务数目:0
// 正在执行task 4
// 线程池中线程数目:5,队列中等待执行的任务数目:1,已执行玩别的任务数目:0
// 线程池中线程数目:5,队列中等待执行的任务数目:2,已执行玩别的任务数目:0
// 线程池中线程数目:5,队列中等待执行的任务数目:3,已执行玩别的任务数目:0
// 线程池中线程数目:5,队列中等待执行的任务数目:4,已执行玩别的任务数目:0
// 线程池中线程数目:5,队列中等待执行的任务数目:5,已执行玩别的任务数目:0
// 线程池中线程数目:6,队列中等待执行的任务数目:5,已执行玩别的任务数目:0
// 线程池中线程数目:7,队列中等待执行的任务数目:5,已执行玩别的任务数目:0
// 线程池中线程数目:8,队列中等待执行的任务数目:5,已执行玩别的任务数目:0
// 正在执行task 10
// 线程池中线程数目:9,队列中等待执行的任务数目:5,已执行玩别的任务数目:0
// 正在执行task 11
// 正在执行task 13
// 正在执行task 12
// 线程池中线程数目:10,队列中等待执行的任务数目:5,已执行玩别的任务数目:0
// 正在执行task 14
// task 0执行完毕
// task 1执行完毕
// 正在执行task 5
// 正在执行task 6
// task 4执行完毕
// task 3执行完毕
// 正在执行task 7
// task 2执行完毕
// 正在执行task 8
// 正在执行task 9
// task 11执行完毕
// task 10执行完毕
// task 14执行完毕
// task 13执行完毕
// task 12执行完毕
// task 6执行完毕
// task 5执行完毕
// task 9执行完毕
// task 8执行完毕
// task 7执行完毕
//从执行结果可以看出,当线程池中线程的数目大于5时,便将任务放入任务缓存队列里面,
// 当任务缓存队列满了之后,便创建新的线程。如果上面程序中,将for循环中改成执行20个任务,就会抛出任务拒绝异常了
}