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

ThreadPoolExecutor executor = new ThreadPoolExecutor(5,/*corePoolSize,核心线程数量(可以提前创建的最大线程数)*/10,/*maxPoolSize,最大线程数量,如果任务够多,核心线程处理不过来,可以用额外的线程(最大线程数-核心线程数)来处理任务*/200, /*time,非核心线程被创建后,如果没有再接到任务,可以存活的最大时长*/TimeUnit.MILLISECONDS, /*timeUnit,时长单位*/new ArrayBlockingQueue<Runnable>(5),/*workQueue used for holding tasks before they are executed. This queue will hold only the Runnable tasks submitted by the execute method,当线程数达到最大时,并且每个线程领到的任务还在执行中,新加入的任务将会放入此任务队列,当队列满时,后面的任务如何处理,由【RejectedExecutionHandler】类的【rejectedExecution】方法实现*/new ThreadPoolExecutor.CallerRunsPolicy()/*handler 线程池拒绝任务时采取的措施的类(调用其方法rejectedExecution)即任务不被线程池中的线程执行,该如何处理:另外创建一个线程执行呢?由父线程执行呢?抛出异常呢?什么都不干呢?......(这就是接口的作用之一吧!)当前策略:调用者运行【未被线程池中的线程运行的任务】默认策略:抛出异常还有其它策略,如什么都不干(空实现RejectedExecutionHandler类)......(自定义RejectedExecutionHandler的实现)*/);

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

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;/***主线程类*@create by gzx on 2022-2-8*/
public class ThreadPoolEx {public static void main(String[] args) {ThreadPoolExecutor executor = new ThreadPoolExecutor(5,10,200,TimeUnit.MILLISECONDS,new ArrayBlockingQueue<Runnable>(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-1
Thread[pool-1-thread-7,5,main] 正在执行 threadtask-7
Thread[main,5,main] 正在执行 threadtask-15
Thread[pool-1-thread-6,5,main] 正在执行 threadtask-5
Thread[pool-1-thread-10,5,main] 正在执行 threadtask-14
Thread[pool-1-thread-8,5,main] 正在执行 threadtask-8
Thread[pool-1-thread-1,5,main] 正在执行 threadtask-0
Thread[pool-1-thread-5,5,main] 正在执行 threadtask-4
Thread[pool-1-thread-4,5,main] 正在执行 threadtask-3
Thread[pool-1-thread-3,5,main] 正在执行 threadtask-2
Thread[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次检测===========

线程池ThreadPoolExecutor的使用相关推荐

  1. Java线程池ThreadPoolExecutor使用和分析

    Java线程池ThreadPoolExecutor使用和分析(一) Java线程池ThreadPoolExecutor使用和分析(二) Java线程池ThreadPoolExecutor使用和分析(三 ...

  2. Python 线程池 ThreadPoolExecutor(二) - Python零基础入门教程

    目录 一.Python 线程池前言 二.Python 线程池 ThreadPoolExecutor 常用函数 1.线程池 as_completed 函数使用 2.线程池 map 函数使用 3.线程池 ...

  3. Python 线程池 ThreadPoolExecutor(一) - Python零基础入门教程

    目录 一.Python 线程池前言 二.Python 线程池原理 三.Python 线程池 ThreadPoolExecutor 函数介绍 四.Python 线程池 ThreadPoolExecuto ...

  4. Java线程池ThreadPoolExecutor的实例

    Java.util中的线程池和Spring框架对这个类的扩展 1.单独通过java里的ThreadPoolExecutor这个类,可以创建线程池,如果系统采用Spring框架设计,可以采用Thread ...

  5. java线程池执行器_Java线程池ThreadPoolExecutor的使用

    Java线程池ThreadPoolExecutor的使用 ThreadPoolExecutor就是我们用来实现线程的一个执行器,它实现了Excutor和ExecutorService接口.Excuto ...

  6. c++ 线程池_JAVA并发编程:线程池ThreadPoolExecutor源码分析

    前面的文章已经详细分析了线程池的工作原理及其基本应用,接下来本文将从底层源码分析一下线程池的执行过程.在看源码的时候,首先带着以下两个问题去仔细阅读.一是线程池如何保证核心线程数不会被销毁,空闲线程数 ...

  7. 线程池ThreadPoolExecutor的使用方法

    private static ExecutorService exec = new ThreadPoolExecutor(8, 8, 0L, TimeUnit.MILLISECONDS, new Li ...

  8. Java线程池—ThreadPoolExecutor

    2019独角兽企业重金招聘Python工程师标准>>> 为什么要使用线程池创建线程?     使用线程池的好处是减少在创建和销毁线程上所花的时间以及系统资源的开销,解决资源不足的问题 ...

  9. JUC(十)-线程池-ThreadPoolExecutor分析

    ThreadPoolExecutor 应用 & 源码解析 文章目录 ThreadPoolExecutor 应用 & 源码解析 一.线程池相关介绍 1.1 为什么有了JDK提供的现有的创 ...

  10. 线程池ThreadPoolExecutor使用简介

    2019独角兽企业重金招聘Python工程师标准>>> 一.简介  线程池类为 java.util.concurrent.ThreadPoolExecutor,常用构造方法为: Th ...

最新文章

  1. 一个交换程序的通用版本
  2. 狮子座2007年星座运程
  3. 最详细的Vue Hello World应用开发步骤
  4. 代码大全和新月神话_神话般的代码
  5. kafka最好用的脚本一:kafka-topic
  6. HDU6608 Fansblog【Miller_Rabin素性测试算法+威尔逊定理】
  7. 使用ACR122U和Proxmark3复制IC卡
  8. Java 简单爬虫 代码
  9. div+css页面布局实战
  10. Python3.7安装教程
  11. Lora sx1278+stm32(ADC录音)+SPPEX音频压缩 数字对讲机
  12. 百度快速排名算法解密-百度搜索引擎快速排名软件-百度快排模拟点击器软件
  13. H5推流解决方案测试环境搭建指南
  14. c语言间隔符号的作用,C语言教学(二)常见的符号
  15. 开源流媒体服务器ZLMediaKit在Windows上运行、配置、按需拉流拉取摄像头rtsp视频流)并使用http-flv网页播放
  16. MATLAB在线文档打不开,怎么解决
  17. python36.dll下载_DWSPY36.dll,下载,简介,描述,修复,等相关问题一站搞定_DLL之家
  18. map,hash_map和unordered_map效率比较
  19. VBA编程中常用过程代码
  20. IT-银行运维-广告方案概述

热门文章

  1. ggtreeExtra包的安装及出现的问题
  2. 实践项目—隐式图的搜索(预习报告)
  3. 应用支持向量机对婴儿EEG数据进行多元模式分析
  4. Bert,Albert,Roberta,XLNet的中英文预训练模型下载网址及教程
  5. Linux-memo
  6. pix2pix测试报错
  7. 脑电数据预处理看这篇就够了
  8. 数值计算原理_计算机什么都能做,到底是怎么工作的?
  9. 苹果手机运行服务器无响应是怎么回事,苹果手机显示无服务状态是什么原因?怎么解决?...
  10. excel自动排班有假期_Excel中的假期周末标志