java如何关闭一个线程_如何关闭一个java线程池

Java 并发工具包中 java.util.concurrent.ExecutorService 接口定义了线程池任务提交、获取线程池状态、线程池停止的方法等。

JDK 1.8 中,线程池的停止一般使用 shutdown()、shutdownNow()方法。

shutdown有序关闭,已提交任务继续执行

不接受新任务

主线程向线程池提交了 10 个任务,休眠 4 秒后关闭线程池,线程池把 10 个任务都执行完成后关闭了。

public static void main(String[] args) {

//创建固定 3 个线程的线程池

ExecutorService threadPool = Executors.newFixedThreadPool(3);

//向线程池提交 10 个任务

for (int i = 1; i <= 10; i++) {

final int index = i;

threadPool.submit(() -> {

System.out.println("正在执行任务 " + index);

//休眠 3 秒

try {

Thread.sleep(3000);

} catch (InterruptedException e) {

e.printStackTrace();

}

});

}

//休眠 4 秒

try {

Thread.sleep(4000);

} catch (InterruptedException e) {

e.printStackTrace();

}

//关闭线程池

threadPool.shutdown();

}

shutdownNow尝试停止所有正在执行的任务

停止等待执行的任务,并返回等待执行的任务列表

主线程向线程池提交了 10 个任务,休眠 4 秒后关闭线程池,线程池执行了数个任务后抛出异常,打印返回的剩余未执行的任务个数。

public static void main(String[] args) {

//创建固定 3 个线程的线程池

ExecutorService threadPool = Executors.newFixedThreadPool(3);

//向线程池提交 10 个任务

for (int i = 1; i <= 10; i++) {

final int index = i;

threadPool.submit(() -> {

System.out.println("正在执行任务 " + index);

//休眠 3 秒

try {

Thread.sleep(3000);

} catch (InterruptedException e) {

e.printStackTrace();

}

});

}

//休眠 4 秒

try {

Thread.sleep(4000);

} catch (InterruptedException e) {

e.printStackTrace();

}

//关闭线程池

List tasks = threadPool.shutdownNow();

System.out.println("剩余 " + tasks.size() + " 个任务未执行");

}

判断线程池是否关闭awaitTermination收到关闭请求后,所有任务执行完成、超时、线程被打断,阻塞直到三种情况任意一种发生

参数可以设置超时时间于超时单位

线程池关闭返回 true;超过设置时间未关闭,返回 false

public static void main(String[] args) {

//创建固定 3 个线程的线程池

ExecutorService threadPool = Executors.newFixedThreadPool(3);

//向线程池提交 10 个任务

for (int i = 1; i <= 10; i++) {

final int index = i;

threadPool.submit(() -> {

System.out.println("正在执行任务 " + index);

//休眠 3 秒

try {

Thread.sleep(3000);

} catch (InterruptedException e) {

e.printStackTrace();

}

});

}

//关闭线程池,设置等待超时时间 3 秒

System.out.println("设置线程池关闭,等待 3 秒...");

threadPool.shutdown();

try {

boolean isTermination = threadPool.awaitTermination(3, TimeUnit.SECONDS);

System.out.println(isTermination ? "线程池已停止" : "线程池未停止");

} catch (InterruptedException e) {

e.printStackTrace();

}

//再等待超时时间 20 秒

System.out.println("再等待 20 秒...");

try {

boolean isTermination = threadPool.awaitTermination(20, TimeUnit.SECONDS);

System.out.println(isTermination ? "线程池已停止" : "线程池未停止");

} catch (InterruptedException e) {

e.printStackTrace();

}

}

shutdown和shutdownNow的异同调用 shutdown() 和 shutdownNow() 方法关闭线程池,线程池都无法接收新的任务。

shutdown() 方法会继续执行正在执行未完成的任务,shutdownNow() 方法会尝试停止所有正在执行的任务。

shutdown() 方法没有返回值,shutdownNow() 方法返回等待执行的任务列表。

awaitTermination(long timeout, TimeUnit unit) 方法可以获取线程池是否已经关闭,需要配合 shutdown() 使用。

shutdownNow() 不一定能够立马结束线程池,该方法会尝试停止所有正在执行的任务,通过调用 Thread.interrupt() 方法来实现的,如果线程中没有 sleep() 、wait()、Condition、定时锁等应用,interrupt() 方法是无法中断当前的线程的。

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

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

相关文章

2048java课程设计报告_软件工程——Java版2048游戏学习报告

2048游戏学习报告姓名:王浩专业:计算机科学与技术年级:15级4班学号:201510411420目录一. 前言 3二. 对游戏的简要分析 31. 游戏的定位分析 32. 游戏的构造分析及对应代码 …

java android rsa加密解密_Android RSA数据加密与Java服务端RSA私钥解密出错问题

1. 出错描述&#xff1a;服务RSA解密抛出javax.crypto.BadPaddingException: Decryption error2.出错原因&#xff1a;Android系统使用的虚拟机(dalvik)跟SUN标准JDK是有所区别的&#xff0c;其中他们默认的RSA实现就不同。即Android端用Cipher.getInstance("RSA")方…

java ee 值范围_【转载】JAVAEE之内置对象和属性范围

内置对象和属性范围​ 四种属性范围​ 九个内置对象1.内置对象如果说想要使用一个对象&#xff0c;必须new 出来&#xff0c;但是在我们的jsp操作中&#xff0c;发现我们使用过的out,request对象没有进行实例化&#xff0c;类似于这样的对象&#xff0c;我们叫做jsp的内置对象&…

java线程池案例_使用Executors 和 ThreadPoolExecutor实现Java线程池案例

并发主题使用Executors 和 ThreadPoolExecutor实现Java线程池案例首先需要一个工作线程&#xff1a;package com.journaldev.threadpool;public class WorkerThread implements Runnable {private String command;public WorkerThread(String s){this.commands;}Overridepublic…

getordefault java_Java map.getOrDefault()方法的用法详解

Map.getOrDefault(Object key, V defaultValue)方法的作用是&#xff1a;当Map集合中有这个key时&#xff0c;就使用这个key值&#xff1b;如果没有就使用默认值defaultValue。代码示例如下&#xff1a;HashMap map new HashMap<>();map.put("name", "co…

java 复合_【福利】java新手做的复合型计算器!

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼先前用那个代码不走样说要审核,我这里不用那个来发代码import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.border.EmptyBorder;import javax.swing.JTextField;import java.awt.GridLayout;import javax.sw…

python模块如何导入解释器_无法从嵌入式解释器导入内置模块(仅限Windows)

这个问题看起来可能是一个重复的问题但我认为我的问题是不同的。我正在从一个MSVC编译的C应用程序运行Python 3.4解释器&#xff0c;并且我尝试使用PTVSD模块来调试更容易。到目前为止&#xff0c;我已经能够连接到Python Ipter&#xff0c;我从命令行开始&#xff0c;没有问题…

java方法的传递方式_JAVA基础--方法传参

JAVA基础--方法传参为啥拿这个当话题&#xff1f;在初学者阶段&#xff0c;许多童鞋都对方法传参比较迷茫&#xff0c;知其然不知其所以然。一.先说说参数传递的几个术语&#xff1a;值调用(call by vale):表示方法接收的是调用者传递的值。引用调用(call by reference):表示方…

java web spark_spark-微型的Java Web框架 Spark Framework

导读热词Spark是一个微型的Java Web框架&#xff0c;它的灵感来自于Sinatra&#xff0c;它的目的是让你以最小的代价创建出一个Java Web应用。Implement CORS in Spark -spark中如何处理跨域资源共享问题代码如下&#xff1a;// Enables CORS on requests. This method is an i…

java udp 协议_网络协议 - UDP 协议详解

网络协议 - UDP 协议详解 基于TCP和UDP的协议非常广泛&#xff0c;所以也有必要对UDP协议进行详解。pdai UDP概述UDP(User Datagram Protocol)即用户数据报协议&#xff0c;在网络中它与TCP协议一样用于处理数据包&#xff0c;是一种无连接的协议。在OSI模型中&#xff0c;在第…

java 8 foreach_Java 8 forEach Stream()与旧版forEach循环

我正在尝试使用Spring的示例代码.部分代码如下所示&#xff1b;private List points;long timeTakeninMilis System.currentTimeMillis();public List getPoints() {return points;}public void setPoints(List points) {this.points points;}public void drawJava8() {point…

java list 超出范围_java-列索引超出范围:2,列数1

我有这个表&#xff1a;学生CREATE TABLE IF NOT EXISTS Klas_student(Student varchar(7) REFERENCES studenten (Studentenummer) ON DELETE CASCADE NOT NULL,Klas text NOT NULL REFERENCES Klas (Naam_id) ON DELETE CASCADE NOT NULL);在此表格中,我想添加值,我使用prepa…

java 写入指定路径文件_java对指定目录下文件读写操作介绍 | 学步园

最近因为项目的国际化的需要&#xff0c;需要对整个项目的100来个插件做国际化&#xff0c;这是一件痛苦的事情&#xff0c;因为纯体力劳动。为了省点工作量&#xff0c;想着能不能写个程序批处理了&#xff0c;减少点工作量&#xff0c;于是就有了下面的代码。1.读取指定的(.j…

点击编辑框全选内容java_Android 中使用EditText 点击全选再次点击取消全选功能

最近在开发浏览器碰到这么一个需求&#xff1a;点击地址栏的时候&#xff0c;需要全选并调出键盘&#xff0c;再次点击就取消全选显示光标。点击屏幕除地址栏其他位置时&#xff0c;键盘隐藏&#xff0c;隐藏光标。大部分浏览器都是这样的逻辑&#xff0c;这样可以提高用户体验…

java数据加密解密代码_java使用RSA加密方式实现数据加密解密的代码

RSA的应用RSA是一种非对称加密算法。现在&#xff0c;很多登陆表单的密码的都采用RSA加密&#xff0c;例如京东中的登陆使用公钥对密码进行加密java使用RSA加密方式实现数据加密解密&#xff0c;需要首先产生私钥和公钥测试代码public static void main(String args[]){try {RS…

java线程卡住排查_基于 Java 线程栈 排查问题

除日志外&#xff0c;还有没有别的方式跟踪线上服务问题呢&#xff1f;或者&#xff0c;跟踪并排除日志里无法发现的问题&#xff1f;方法当然是有的&#xff0c;就是通过现场快照定位并发现问题。我们所说的现场&#xff0c;主要指这两方面&#xff1a;Java 线程栈。线程栈是J…

java实验二答案天津商业大学_天津商业大学信息安全实验一

天津商业大学信息安全实验一 1《信息安全技术》实 验 报 告 书实验名称&#xff1a; 实验一Internet应用风险专 业&#xff1a; 电子商务班 级&#xff1a; 1203班姓 名&#xff1a; 代常发学 号&#xff1a; 20124934指导老师&#xff1a; 丁雷信息工程学院2015 年 5 月2目 录…

java前端的日期插件_几个前端时间插件总结

几个前端时间插件总结总结一下几款时间插件&#xff0c;分别是- [ ] jeDate 手册http://www.jemui.com/jedate/- [ ] bootstrap-datetimepicker 下载地址- [ ] My97DatePicker 下载地址- [ ] jQuery UI 插件Datepicker下载地址并没有哪款完全超越另外一款&#xff0c;主要还是看…

t3s java_关于JAVA的this关键字

网上对this的描述很朦胧&#xff0c;有的说this表示的是当前对象自己&#xff0c;有的说this是当前对象的引用。可是自己写了如下的测试代码&#xff0c;产生了几个问题&#xff1a;1 public class T3AboutThis {23 public static void main(String[] args) {4 new…

Java插件自动保存浏览器书签_多浏览器书签同步插件EverSync

有时上网时会遇到浏览器不能正常显示的问题。(比如我的火狐浏览器无法正确显示微信公众号管理后台&#xff0c;在chrome上可以正常显示)&#xff0c;所以我的电脑里安装了chrome和firefox两个浏览器。但是时间长了&#xff0c;会出现两个浏览器上书签不同步的问题。原来自己的解…