欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

线程池ThreadPoolExecutor的使用

时间:2023-07-09

创建一个线程池(参数解读):

ThreadPoolExecutor executor = new ThreadPoolExecutor(5,10,200, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(5),new ThreadPoolExecutor.CallerRunsPolicy());

线程任务:打印当前任务被哪个线程执行

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(5),new ThreadPoolExecutor.CallerRunsPolicy());//创建线程池new Thread(new ThreadPoolCheck(executor)).start();//先额外启动一个线程,检测线程池的状态executor.prestartAllCoreThreads();//提前启动线程池所有核心线程for(int i=0;i<20;i++) {//创建20个线程任务,至少任务15个肯定由线程池中的线程执行(最大线程数+任务队列中的任务数)//剩下的任务,由主线程(采取CallerRunsPolicy策略)执行ThreadTask threadTask = new ThreadTask("threadtask-"+i);executor.execute(threadTask);//执行线程任务}if (!executor.isShutdown()) {executor.shutdown();//关闭线程池}}}

一次运行结果打印的信息如下:
可以看到有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次检测===========

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。