Java多线程技术11——ThreadPoolExecutor类的使用2

1 isShutdown()方法

        public boolean  isShutdown()方法的作用是判断线程池是否已经关闭

public class Run1 {public static void main(String[] args) {Runnable runnable = new Runnable() {@Overridepublic void run() {try {System.out.println("开始: " + Thread.currentThread().getName());Thread.sleep(1000);System.out.println("结束: " + Thread.currentThread().getName());}catch (InterruptedException e){e.printStackTrace();}}};ThreadPoolExecutor pool = new ThreadPoolExecutor(2,2,Integer.MAX_VALUE, TimeUnit.SECONDS,new LinkedBlockingDeque<>());pool.execute(runnable);System.out.println("A = " + pool.isShutdown());pool.shutdown();System.out.println("B = " + pool.isShutdown());}
}

        由运行结果可知,只要调用了shutdown()方法,isShutdown()方法的返回值就是true。

2  isTerminating()和isTerminated()方法

        public boolean isTerminating()方法:如果此执行程序处于在shutdown或shutdownNow之后且正在终止但尚未完全终止的过程中,也就是还有任务在执行,则返回true。此方法可以比喻成门是否正在关闭。

      public boolean isTerminated()方法:如果关闭后所有任务都已完成,则返回true。此方法可以比喻成门是否已经关闭。

        shutdown或shutdownNow方法的功能是发出一个关闭线程池的命令,isShutdown方法用于判断关闭线程池的命令发出或未发出。  isTerminating方法用于判断线程池是否正在关闭中,isTerminated方法判断线程池是否已经关闭了。

public class MyRunnable implements Runnable{@Overridepublic void run() {try {System.out.println(Thread.currentThread().getName()+"begin: "+ Utils.data(System.currentTimeMillis()));Thread.sleep(2000);System.out.println(Thread.currentThread().getName()+"end: "+ Utils.data(System.currentTimeMillis()));}catch (InterruptedException e){e.printStackTrace();}}
}

public class Test {public static void main(String[] args) throws InterruptedException {MyRunnable runnable = new MyRunnable();ThreadPoolExecutor pool = new ThreadPoolExecutor(2,99999,99999, TimeUnit.SECONDS,new LinkedBlockingDeque<>());pool.execute(runnable);pool.execute(runnable);pool.execute(runnable);pool.execute(runnable);System.out.println(pool.isTerminating() + " " + pool.isTerminated());pool.shutdown();Thread.sleep(1000);System.out.println(pool.isTerminating() + " " + pool.isTerminated());Thread.sleep(1000);System.out.println(pool.isTerminating() + " " + pool.isTerminated());Thread.sleep(1000);System.out.println(pool.isTerminating() + " " + pool.isTerminated());Thread.sleep(1000);System.out.println(pool.isTerminating() + " " + pool.isTerminated());Thread.sleep(1000);System.out.println(pool.isTerminating() + " " + pool.isTerminated());}
}

3  awaitTermination(long timeout, TimeUnit unit)

         public boolean awaitTermination(long timeout, TimeUnit unit)方法:查看在指定的时间内,线程池是否已经终止工作,也就是“最多”等待多少时间后去判断线程池是否已经终止工作。如果在指定的时间之内,线程池销毁会导致该方法不再阻塞,而超过timeout时间也会导致该方法不再阻塞。此方法的使用需要shutdown()方法的配合。

public class MyRunnable1 implements Runnable{@Overridepublic void run() {try {System.out.println(Thread.currentThread().getName() + " " + Utils.data(System.currentTimeMillis()));Thread.sleep(4000);System.out.println(Thread.currentThread().getName() + " " + Utils.data(System.currentTimeMillis()));}catch (InterruptedException e){e.printStackTrace();}}
}
public class Test1 {public static void main(String[] args) throws InterruptedException {MyRunnable1 runnable1 = new MyRunnable1();ThreadPoolExecutor pool = new ThreadPoolExecutor(2,99999,9999L, TimeUnit.SECONDS,new LinkedBlockingQueue<>());pool.execute(runnable1);System.out.println("main开始:" + Utils.data(System.currentTimeMillis()));System.out.println(pool.awaitTermination(10,TimeUnit.SECONDS));System.out.println("main结束:" + Utils.data(System.currentTimeMillis()));}
}

        从控制台可以看出,main开始到main结束需要10秒,因为main线程并未销毁,所以 awaitTermination方法需要阻塞10秒。打印false的原因是未对线程池执行shutdown方法。如果对线程池执行shutdown方法,在运行时间上会有什么效果呢?

public class Test2 {public static void main(String[] args) throws InterruptedException {MyRunnable1 runnable1 = new MyRunnable1();ThreadPoolExecutor pool = new ThreadPoolExecutor(2,99999,9999L, TimeUnit.SECONDS,new LinkedBlockingQueue<>());pool.execute(runnable1);pool.shutdown();System.out.println("main开始:" + Utils.data(System.currentTimeMillis()));System.out.println(pool.awaitTermination(10,TimeUnit.SECONDS));System.out.println("main结束:" + Utils.data(System.currentTimeMillis()));}
}

        可以看出,main开始和mian结束之间耗时4秒,因为4秒后线程池销毁了,导致 awaitTermination方法取消阻塞。

4 set/getRejectedExceptionHandler()方法

        public void setRejectedExecutionHandler(RejectedExecutionHandler handler)和

        public RejectedExecutionHandler getRejectedExecutionHandler()方法的作用是可以处理任务被拒绝执行时的行为。

public class MyRunnable1 implements Runnable{private String username;public MyRunnable1(String username) {this.username = username;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}@Overridepublic void run() {try {System.out.println(Thread.currentThread().getName()+ "开始时间 =  " + Utils.data(System.currentTimeMillis()));Thread.sleep(4000);System.out.println(Thread.currentThread().getName()+ "结束时间 =  " + Utils.data(System.currentTimeMillis()));}catch (InterruptedException e){e.printStackTrace();}}
}
public class Run1 {public static void main(String[] args) {MyRunnable1 myRunnable1 = new MyRunnable1("a1");MyRunnable1 myRunnable2 = new MyRunnable1("a2");MyRunnable1 myRunnable3 = new MyRunnable1("a3");MyRunnable1 myRunnable4 = new MyRunnable1("a4");ThreadPoolExecutor pool = new ThreadPoolExecutor(2,3,999L, TimeUnit.SECONDS,new SynchronousQueue<>());pool.execute(myRunnable1);pool.execute(myRunnable2);pool.execute(myRunnable3);pool.execute(myRunnable4);}
}

        控制台打印的信息说明  MyRunnable1 myRunnable4 = new MyRunnable1("a4");任务被拒绝执行,在出现这样的异常时可以自定义拒绝执行任务的行为。创建MyRejectedExecutionHandler.java类。

public class MyRejectedExecutionHandler implements RejectedExecutionHandler {@Overridepublic void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {System.out.println(((MyRunnable1) r).getUsername() + "被拒绝执行");}
}

public class Run2 {public static void main(String[] args) {MyRunnable1 myRunnable1 = new MyRunnable1("a1");MyRunnable1 myRunnable2 = new MyRunnable1("a2");MyRunnable1 myRunnable3 = new MyRunnable1("a3");MyRunnable1 myRunnable4 = new MyRunnable1("a4");ThreadPoolExecutor pool = new ThreadPoolExecutor(2,3,999L, TimeUnit.SECONDS,new SynchronousQueue<>());pool.setRejectedExecutionHandler(new MyRejectedExecutionHandler());pool.execute(myRunnable1);pool.execute(myRunnable2);pool.execute(myRunnable3);pool.execute(myRunnable4);pool.shutdown();}
}

5 allowsCoreThreadTimeOut()和allowCoreThreadTimeOut(bool)方法

        allowsCoreThreadTimeOut(true)可使核心池中的空闲线程具有超时销毁的特性。其中,public boolean allowsCoreThreadTimeOut() 方法的作用是判断是否具有这个特性。

public void allowCoreThreadTimeOut(boolean value)方法的作用是设置是否有这个特性。

public class MyRunnable implements Runnable{@Overridepublic void run() {System.out.println(Thread.currentThread() + "开始:" + Utils.data(System.currentTimeMillis()));System.out.println(Thread.currentThread() + "结束:" + Utils.data(System.currentTimeMillis()));}
}
public class Run1 {public static void main(String[] args) throws InterruptedException {ThreadPoolExecutor pool = new ThreadPoolExecutor(4,5,5, TimeUnit.SECONDS,new SynchronousQueue<>());System.out.println(pool.allowsCoreThreadTimeOut());for (int i = 0; i < 4; i++) {MyRunnable myRunnable = new MyRunnable();pool.execute(myRunnable);}Thread.sleep(8000);System.out.println(pool.getPoolSize());}
}

创建Run2.java类

public class Run2 {public static void main(String[] args) throws InterruptedException {ThreadPoolExecutor pool = new ThreadPoolExecutor(4,5,5, TimeUnit.SECONDS,new SynchronousQueue<>());pool.allowCoreThreadTimeOut(true);System.out.println(pool.allowsCoreThreadTimeOut());for (int i = 0; i < 4; i++) {MyRunnable myRunnable = new MyRunnable();pool.execute(myRunnable);}Thread.sleep(8000);System.out.println(pool.getPoolSize());}
}

 

6 prestartCoreThread()和prestartAllCoreThreads()方法

        在实例化ThreadPoolExecutor类后,线程池并没有核心线程,除非执行execute()方法,但是在不执行execute()方法时也可以通过执行prestartCoreThread()和prestartAllCoreThreads()方法来创建核心线程。

        public boolean prestartCoreThread()方法的作用是每调用一次就创建一个核心线程并使它变成启动状态,返回值类型为boolean,代表是否创建成功。

        public int prestartAllCoreThreads()方法的作用是同时启动全部核心线程,返回值是启动核心线程的数量。

public class Run1 {public static void main(String[] args) {ThreadPoolExecutor pools = new ThreadPoolExecutor(4,8,5, TimeUnit.SECONDS,new LinkedBlockingQueue<>());System.out.println("线程池中的线程数a= " + pools.getPoolSize());System.out.println("Z1 = " + pools.prestartCoreThread());System.out.println("线程池中的线程数a= " + pools.getPoolSize());System.out.println("Z2 = " + pools.prestartCoreThread());System.out.println("线程池中的线程数a= " + pools.getPoolSize());System.out.println("Z3 = " + pools.prestartCoreThread());System.out.println("线程池中的线程数a= " + pools.getPoolSize());System.out.println("Z4 = " + pools.prestartCoreThread());System.out.println("线程池中的线程数a= " + pools.getPoolSize());System.out.println("Z5 = " + pools.prestartCoreThread());System.out.println("线程池中的线程数a= " + pools.getPoolSize());System.out.println("Z6 = " + pools.prestartCoreThread());}
}

                

        最后连续打印了2个false代表核心池中的线程数量已经到了最大值,是4。不能再创建新的核心池中的线程了。

        创建Run2.java类。

public class Run2 {public static void main(String[] args) {ThreadPoolExecutor pools = new ThreadPoolExecutor(4,8,5, TimeUnit.SECONDS,new LinkedBlockingQueue<>());System.out.println("线程池中的线程数a= " + pools.getPoolSize());System.out.println("Z1 = " + pools.prestartAllCoreThreads());System.out.println("线程池中的线程数a= " + pools.getPoolSize());System.out.println();System.out.println("Z2 = " + pools.prestartAllCoreThreads());System.out.println("线程池中的线程数a= " + pools.getPoolSize());}
}

 

        打印信息Z2 = 0,说明核心池中的线程已满,不需要创建新的核心池中的线程。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/604041.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件安装文档 | MinIO

# docker 下载镜像 docker pull minio/minio# 安装镜像docker run \ --name minio \ -p 19000:9000 \ -p 19090:9090 \ -d --restartalways \ -e "MINIO_ROOT_USERsuweijie" \ -e "MINIO_ROOT_PASSWORDSuweijie0217" \ -v /home/data:/data \ -v /home/c…

嵌入式培训机构四个月实训课程笔记(完整版)-Linux系统编程第三天-Linux进程练习题(物联技术666)

更多配套资料CSDN地址:点赞+关注,功德无量。更多配套资料,欢迎私信。 物联技术666_嵌入式C语言开发,嵌入式硬件,嵌入式培训笔记-CSDN博客物联技术666擅长嵌入式C语言开发,嵌入式硬件,嵌入式培训笔记,等方面的知识,物联技术666关注机器学习,arm开发,物联网,嵌入式硬件,单片机…

优化|PLSA理论与实践

PLSA又称为概率潜在语义分析&#xff0c;是一种利用概率生成模型对文本集合进行话题分析的无监督学习方法。该模型最大的特点是加入了主题这一隐变量&#xff0c;文本生成主题&#xff0c;主题生成单词&#xff0c;从而得到单词-文本共现矩阵。本文将对包含物理学、计算机科学、…

学习笔记——C++中的循环结构 while语句

while循环语句 作用&#xff1a;满足循环条件&#xff0c;执行循环语句 语法&#xff1a;while&#xff08;循环条件&#xff09;{循环语句} 解释&#xff1a;只要循环条件的结果为真&#xff0c;就执行循环语句 以打印0-9这十个数字为例&#xff0c;特别需要注意的是&…

Anaconda安装失败及解决办法

查看Anaconda版本时正常显示 报错显示&#xff1a; 解决办法&#xff1a; 确保系统要求满足&#xff1a;检查你的操作系统是否满足 Anaconda 的最低要求。例如&#xff0c;确保你使用的是 64 位操作系统&#xff0c;同时具备足够的磁盘空间。禁用防病毒软件&#xff1a;某些防…

单片机原理及应用:独立式键盘控制LED与多功能按键识别

今天来介绍另一个外设——按键与LED的配合工作&#xff0c;与开关不同&#xff0c;按键需要注意消除抖动带来的影响&#xff0c;代码逻辑也会更复杂一写&#xff0c;下面先为大家介绍独立式键盘的相关知识。 单片机的独立式键盘指的是一种不依赖于计算机或其他外部设备的键盘输…

【STM32学习】硬件CRC与传统CRC-32计算的不同点

硬件CRC与传统CRC-32计算的不同点 1、stm32的硬件CRC32与传统CRC-32有何不同&#xff1f;2、解决办法 1、stm32的硬件CRC32与传统CRC-32有何不同&#xff1f; ①STM32F103的硬件CRC校验是对整个32位字进行CRC计算&#xff0c;传统的CRC-32是逐字节的计算。 ②STM32的硬件CRC32的…

基于SSM的校内信息服务发布系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

Redis高并发高可用(集群)

Redis Cluster是Redis的分布式解决方案,在3.0版本正式推出,有效地解决了Redis分布式方面的需求。当遇到单机内存、并发、流量等瓶颈时,可以采用Cluster架构方案达到负载均衡的目的。之前,Redis分布式方案一般有两种: 1、客户端分区方案,优点是分区逻辑可控,缺点是需要自己…

初识动态内存管理

前言&#xff1a; 我们都知道&#xff0c;内存分为几个区——栈区、堆区、静态区、常量区、代码区&#xff0c;我们在写代码的时候经常会遇到栈溢出这个问题&#xff0c;是因为在程序运行之前&#xff0c;我们无法准确的知道要分配多少空间给程序&#xff0c;所以说很容易造…

CentOS使用docker安装mysql并使用navicat 远程链接

这篇文章没用开启mysql的挂载功能&#xff0c;如果想开启的话可以和我的下篇文章结合着看。 CentOS中开启mysql挂载-CSDN博客 docker在之前的文章中已经安装完成了 这里输入命令查询已被上传的MySQL镜像 docker search mysql这里stars代表点赞数&#xff0c;official代表官…

KNN 回归

K 近邻回归&#xff08;K-Nearest Neighbors Regression&#xff09;是一种基于实例的回归算法&#xff0c;用于预测连续数值型的输出变量。它的基本思想是通过找到与给定测试样本最近的 K 个训练样本&#xff0c;并使用它们的输出值来预测测试样本的输出。它与 K 最近邻分类类…

计算机毕业设计----SSM场地预订管理系统

项目介绍 本项目分为前后台&#xff0c;前台为普通用户登录&#xff0c;后台为管理员登录&#xff1b; 用户角色包含以下功能&#xff1a; 按分类查看场地,用户登录,查看网站公告,按分类查看器材,查看商品详情,加入购物车,提交订单,查看订单,修改个人信息等功能。 管理员角…

java基于SSM的二手交易平台设计与开发论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本二手交易平台就是在这样的大环境下诞生&#xff0c;其可以帮助使用者在短时间内处理完毕庞大的数据信息&am…

基于SSM的基金投资交易管理网站的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

说反话-加强版

主要&#xff1a;使用strtok函数&#xff08;将字符串以空格分开&#xff09;&#xff08;若不了解strtok函数&#xff0c;我在其它文章已说明&#xff09; #include <stdio.h> #include <string.h> int main() { int i 0; int z 0; char* str[5000…

技术方向:比较与选择

针对未入行、刚入行、工作好几年依然不停切换择业方向、长期技术无法突破的人。 1 技术栈 一切的开始其实是对编程的兴趣&#xff0c;兴趣指引你跨过所有障碍。 编程语言是基础&#xff0c;编程语言之上&#xff0c;发展为两个主要方向&#xff0c;服务和大数据。 2 编程语言…

性能分析与调优: Linux 监测工具的数据来源

目录 一、实验 1.环境 2. proc目录 3. sys目录 4.netlink 5.tracepoint 6.kprobes 7. uprobes 二、问题 1.systemd如何查看启动时间 2.CentOS与Ubuntu如何安装bpftrace 3.snap有哪些常用的命令 4.snap如何安装store 5.如何列出使用bpftracede的OpenJDK USDT探针 …

清华大学生物信息学课件资料分享

清华大学鲁志老师实验室在网上分享了他们的生信课程学习资料&#xff0c;有电子书&#xff0c;PPT和视频&#xff0c;真是生信学习者的福音。 实验室网址是&#xff1a; https://www.ncrnalab.org/courses/#bioinfo2 可以看到&#xff0c;课程有针对本科生的&#xff0c;也有针…

(21)Linux的文件描述符输出重定向

一、文件描述符 1、文件描述符的底层理解 在上一章中&#xff0c;我们已经把 fd 的基本原理搞清楚了&#xff0c;知道了 fd 的值为什么是 0,1,2,3,4,5... 也知道了 fd 为什么默认从 3 开始&#xff0c;而不是从 0,1,2&#xff0c;因为其在内核中属于进程和文件的对应关系。 …