任务类:
package com._ThreadPool; public class MyTask implements Runnable { private int taskId; public MyTask(int id){ this.taskId = id; } @Override public void run() { System.out.println("Mytask" + taskId +"开始执行 "); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Mytask" + taskId + "执行结束 "); } }
线程池1:
package com._ThreadPool; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.Executor; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; public class MyExecutor { 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 task = new MyTask(i); executor.execute(task); System.out.println("线程池中的线程数量" + executor.getPoolSize()+ "队列中等待的数目" + executor.getQueue().size() + "已经执行完的任务数目" + executor.getCompletedTaskCount()); } executor.shutdown(); } }
结果:
Mytask0开始执行 线程池中的线程数量1队列中等待的数目0已经执行完的任务数目0 线程池中的线程数量2队列中等待的数目0已经执行完的任务数目0 Mytask1开始执行 线程池中的线程数量3队列中等待的数目0已经执行完的任务数目0 Mytask2开始执行 线程池中的线程数量4队列中等待的数目0已经执行完的任务数目0 Mytask3开始执行 线程池中的线程数量5队列中等待的数目0已经执行完的任务数目0 Mytask4开始执行 线程池中的线程数量5队列中等待的数目1已经执行完的任务数目0 线程池中的线程数量5队列中等待的数目2已经执行完的任务数目0 线程池中的线程数量5队列中等待的数目3已经执行完的任务数目0 线程池中的线程数量5队列中等待的数目4已经执行完的任务数目0 线程池中的线程数量5队列中等待的数目5已经执行完的任务数目0 线程池中的线程数量6队列中等待的数目5已经执行完的任务数目0 Mytask10开始执行 线程池中的线程数量7队列中等待的数目5已经执行完的任务数目0 Mytask11开始执行 线程池中的线程数量8队列中等待的数目5已经执行完的任务数目0 Mytask12开始执行 线程池中的线程数量9队列中等待的数目5已经执行完的任务数目0 Mytask13开始执行 线程池中的线程数量10队列中等待的数目5已经执行完的任务数目0 Mytask14开始执行 Mytask0执行结束 Mytask5开始执行 Mytask3执行结束 Mytask14执行结束 Mytask13执行结束 Mytask11执行结束 Mytask1执行结束 Mytask2执行结束 Mytask10执行结束 Mytask4执行结束 Mytask12执行结束 Mytask9开始执行 Mytask8开始执行 Mytask7开始执行 Mytask6开始执行 Mytask5执行结束 Mytask7执行结束 Mytask6执行结束 Mytask8执行结束 Mytask9执行结束 Process finished with exit code 0
首先填满核心线程数,然后填满队列,然后填满最大线程数。