创建一个线程池(参数解读):
ThreadPoolExecutor executor = new ThreadPoolExecutor(5,10,200, TimeUnit.MILLISECONDS, new ArrayBlockingQueue
线程任务:打印当前任务被哪个线程执行
package concurrent;class ThreadTask implements Runnable { String taskName; public ThreadTask(String taskName) { this.taskName = taskName; } public void run() { System.out.println(Thread.currentThread()+" 正在执行 "+taskName); try { //随便睡一会,领导叫了再去干活! Thread.sleep((long)(Math.random()*10000)); } catch (InterruptedException e) { System.out.println("任务"+taskName+"被异常终止"); } System.out.println("任务"+taskName+"被正常执行完毕"); }}
线程池状态检测:每隔1000ms左右打印一次检测信息到控制台
package concurrent;import java.util.concurrent.ThreadPoolExecutor;class ThreadPoolCheck implements Runnable {ThreadPoolExecutor executor;public ThreadPoolCheck(ThreadPoolExecutor executor) {this.executor=executor;}private void showPoolInfo(ThreadPoolExecutor executor,int count){System.out.println("=========开始第"+count+"次检测===========");System.out.println("已经执行完成的任务数目:"+executor.getCompletedTaskCount());System.out.println("队列中等待执行的任务数目:"+executor.getQueue().size());System.out.println("线程池中核心线程数:"+executor.getCorePoolSize());System.out.println("线程池中活跃线程数目:"+executor.getActiveCount());System.out.println("线程池中允许的最大线程数目:"+executor.getMaximumPoolSize());System.out.println("=========完成第"+count+"次检测===========");}public void run() {int count=0; while(true){count++;try {//睡一下,再继续工作吧!Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}showPoolInfo(executor,count);//线程池都死了,我也不独活了!if(executor.isTerminated()){break;} }}}
主线程:创建线程池、线程任务
package concurrent;import java.util.concurrent.ArrayBlockingQueue;import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.TimeUnit;public class ThreadPoolEx {public static void main(String[] args) {ThreadPoolExecutor executor = new ThreadPoolExecutor(5,10,200,TimeUnit.MILLISECONDS,new ArrayBlockingQueue
一次运行结果打印的信息如下:
可以看到有2个任务不是由线程池中的线程执行的,而是由主线程执行的,是因为我采取了CallerRunsPolicy策略。总共创建了20个任务,但线程池中的线程只执行了其中18个任务。
Thread[pool-1-thread-2,5,main] 正在执行 threadtask-1Thread[pool-1-thread-7,5,main] 正在执行 threadtask-7Thread[main,5,main] 正在执行 threadtask-15Thread[pool-1-thread-6,5,main] 正在执行 threadtask-5Thread[pool-1-thread-10,5,main] 正在执行 threadtask-14Thread[pool-1-thread-8,5,main] 正在执行 threadtask-8Thread[pool-1-thread-1,5,main] 正在执行 threadtask-0Thread[pool-1-thread-5,5,main] 正在执行 threadtask-4Thread[pool-1-thread-4,5,main] 正在执行 threadtask-3Thread[pool-1-thread-3,5,main] 正在执行 threadtask-2Thread[pool-1-thread-9,5,main] 正在执行 threadtask-10任务threadtask-3被正常执行完毕Thread[pool-1-thread-4,5,main] 正在执行 threadtask-6=========开始第1次检测===========已经执行完成的任务数目:1队列中等待执行的任务数目:4线程池中核心线程数:5线程池中活跃线程数目:10线程池中允许的最大线程数目:10=========完成第1次检测===========任务threadtask-6被正常执行完毕Thread[pool-1-thread-4,5,main] 正在执行 threadtask-9任务threadtask-15被正常执行完毕Thread[main,5,main] 正在执行 threadtask-18任务threadtask-7被正常执行完毕Thread[pool-1-thread-7,5,main] 正在执行 threadtask-11=========开始第2次检测===========已经执行完成的任务数目:3队列中等待执行的任务数目:4线程池中核心线程数:5线程池中活跃线程数目:10线程池中允许的最大线程数目:10=========完成第2次检测===========任务threadtask-4被正常执行完毕Thread[pool-1-thread-5,5,main] 正在执行 threadtask-12任务threadtask-0被正常执行完毕Thread[pool-1-thread-1,5,main] 正在执行 threadtask-13任务threadtask-8被正常执行完毕Thread[pool-1-thread-8,5,main] 正在执行 threadtask-16=========开始第3次检测===========已经执行完成的任务数目:6队列中等待执行的任务数目:1线程池中核心线程数:5线程池中活跃线程数目:10线程池中允许的最大线程数目:10=========完成第3次检测====================开始第4次检测===========已经执行完成的任务数目:6队列中等待执行的任务数目:1线程池中核心线程数:5线程池中活跃线程数目:10线程池中允许的最大线程数目:10=========完成第4次检测===========任务threadtask-18被正常执行完毕=========开始第5次检测===========已经执行完成的任务数目:6队列中等待执行的任务数目:2线程池中核心线程数:5线程池中活跃线程数目:10线程池中允许的最大线程数目:10=========完成第5次检测====================开始第6次检测===========已经执行完成的任务数目:6队列中等待执行的任务数目:2线程池中核心线程数:5线程池中活跃线程数目:10线程池中允许的最大线程数目:10=========完成第6次检测===========任务threadtask-11被正常执行完毕Thread[pool-1-thread-7,5,main] 正在执行 threadtask-17任务threadtask-1被正常执行完毕Thread[pool-1-thread-2,5,main] 正在执行 threadtask-19=========开始第7次检测===========已经执行完成的任务数目:8队列中等待执行的任务数目:0线程池中核心线程数:5线程池中活跃线程数目:10线程池中允许的最大线程数目:10=========完成第7次检测===========任务threadtask-2被正常执行完毕任务threadtask-9被正常执行完毕任务threadtask-10被正常执行完毕=========开始第8次检测===========已经执行完成的任务数目:11队列中等待执行的任务数目:0线程池中核心线程数:5线程池中活跃线程数目:7线程池中允许的最大线程数目:10=========完成第8次检测===========任务threadtask-13被正常执行完毕任务threadtask-14被正常执行完毕任务threadtask-16被正常执行完毕=========开始第9次检测===========已经执行完成的任务数目:14队列中等待执行的任务数目:0线程池中核心线程数:5线程池中活跃线程数目:4线程池中允许的最大线程数目:10=========完成第9次检测===========任务threadtask-5被正常执行完毕=========开始第10次检测===========已经执行完成的任务数目:15队列中等待执行的任务数目:0线程池中核心线程数:5线程池中活跃线程数目:3线程池中允许的最大线程数目:10=========完成第10次检测====================开始第11次检测===========已经执行完成的任务数目:15队列中等待执行的任务数目:0线程池中核心线程数:5线程池中活跃线程数目:3线程池中允许的最大线程数目:10=========完成第11次检测====================开始第12次检测===========已经执行完成的任务数目:15队列中等待执行的任务数目:0线程池中核心线程数:5线程池中活跃线程数目:3线程池中允许的最大线程数目:10=========完成第12次检测===========任务threadtask-12被正常执行完毕=========开始第13次检测===========已经执行完成的任务数目:16队列中等待执行的任务数目:0线程池中核心线程数:5线程池中活跃线程数目:2线程池中允许的最大线程数目:10=========完成第13次检测===========任务threadtask-19被正常执行完毕=========开始第14次检测===========已经执行完成的任务数目:17队列中等待执行的任务数目:0线程池中核心线程数:5线程池中活跃线程数目:1线程池中允许的最大线程数目:10=========完成第14次检测===========任务threadtask-17被正常执行完毕=========开始第15次检测===========已经执行完成的任务数目:18队列中等待执行的任务数目:0线程池中核心线程数:5线程池中活跃线程数目:0线程池中允许的最大线程数目:10=========完成第15次检测===========