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() 方法是无法中断当前的线程的。

java如何关闭一个线程_如何关闭一个java线程池相关推荐

  1. java线程的创建线程_多线程(Thread、线程创建、线程池)

    第1章 多线程 1.1 多线程介绍 学习多线程之前,我们先要了解几个关于多线程有关的概念. 进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序, ...

  2. java什么时候新建进程_创建名为“ {java}”的线程(即轻量级进程)是为了什么?...

    小编典典 所有这些线程都属于JVM. 运行jstack 以获取线程列表. "main" #1 prio=5 os_prio=0 cpu=150.00ms elapsed=8.04s ...

  3. reentrantlock非公平锁不会随机挂起线程?_【原创】Java并发编程系列16 | 公平锁与非公平锁...

    本文为何适原创并发编程系列第 16 篇,文末有本系列文章汇总. 上一篇提到重入锁 ReentrantLock 支持两种锁,公平锁与非公平锁.那么这篇文章就来介绍一下公平锁与非公平锁. 为什么需要公平锁 ...

  4. java kill线程_如何优雅的 kill 线程

    kill 掉一个线程,感觉是一件很简单的事情,比如 JAVA 中为我们提供了 stop 方法可以立即终止线程的执行,达到 kill 掉线程的目的. 但实际上对线程的操作是一件精细活,对于一段正在执行的 ...

  5. java调用打印预览_急求一个用Java实现的打印及打印预览功能的Demo

    展开全部 package com.szallcom.tools; import java.awt.BorderLayout; import java.awt.Color; import java.aw ...

  6. java map 随机取值_随机获取一个集合(List, Set)中的元素,随机获取一个Map中的key或value...

    利用Java提供的Random类.从List或Set中随机取出一个元素,从Map中随机获取一个key或value. 因为Set没有提供get(int index)方法,仅仅能先获取一个随机数后.利用一 ...

  7. java程序笑脸怎么打_我编写的JAVA程序为什么在编译执行后会先打出一个笑脸呢?...

    嗯,我个人认为,从键盘输入再输出意义不是很大,如果楼主有C的基础,那么这个输入将是一个很好练习,因为java的输入和输出与C有很大的区别,废话不多说 首先,无论是在Eclipse的控制台上还是CMD模 ...

  8. 线程池默认多少个线程_我需要多少个线程?

    线程池默认多少个线程 这取决于您的应用程序. 但是,对于那些希望对如何从生产站点购买的所有昂贵内核中挤出大量资金的人,请多多包涵,我将阐明围绕多线程 Java应用程序的奥秘. 内容针对最典型的Java ...

  9. weblogic最大线程_处理Weblogic卡住的线程

    weblogic最大线程 定义或什么是缠线?   如果线程 在设定 的时间 内连续工作(非空闲),则WebLogic Server会将其诊断为阻塞 . 您可以通过更改在诊断出线程被阻塞之前的时间长度( ...

  10. 如何用vbs编写一个游戏_如何编写一个 SkyWalking 插件

    点击上方"开源社"关注我们 | 作者:vcjmhg| 编辑:李明康| 责编:袁睿斌 | 设计:叶修缘丶 1 概述 之前几篇文章,我们着重介绍了在对 SkyWalking 进行二次开 ...

最新文章

  1. 6、计算机图形学——着色频率、插值与插值的矫正
  2. linux automake-1.16 编译错误 Try `--no-discard-stderr' if option outputs to stderr
  3. MAC能登录微信,浏览器连不上网
  4. 存储块的删除与状态查询
  5. 『中级篇』Docker Cloud自动构建 Docker image(55)
  6. centos7;windows下安装和使用spice
  7. SAP Spartacus module 层级结构设计的一种实践
  8. 渗透测试:k8s的3种攻击手段(Kubernetes、未授权漏洞,端口:8080、6443、10250)
  9. linux那些事之gup_flags
  10. 3dvary灯光材质为什么不亮_关机后电脑灯光闪瞎狗眼?在这里关闭它
  11. 【BZOJ1911】【codevs1318】特别行动队,斜率优化DP
  12. bootstraptable 怎么在特定行添加数据_同等权限下多任职之间数据权限的实例
  13. python里打印空格_python打印空格
  14. 2016 Multi-University Training Contest 2 1012 La Vie en rose (暴力)
  15. mac pycharm如何打开setting
  16. 电商路演投资计划融资报告PPT模板
  17. 记——博客后台管理系统
  18. 【Java设计模式】外观模式
  19. 百度智能云TechDay干货满满!揭秘“百度太行”硬核技术,秀业务上云组合拳
  20. Android自定义View,Android炫酷的音乐频谱进度条,变化自如的音乐进度条

热门文章

  1. idea代码补全声明代码_用了这么多年idea,竟然不知道这些代码补全功能
  2. 页表长度和页表大小_在请求调页系统中,若逻辑地址中的页号超过页表控制寄存器中的页表长度,则会引起( ) 。_学小易找答案...
  3. 无法扩展该卷 因为群集的数量将超过文件系统_浏览器将支持Python项目!Mozilla发布Pyodide...
  4. Win7系统提示NVIDIA显示设置不可用怎么办
  5. 搜狐视频怎么开启自动连播
  6. Windows/Android/IOS平台如何在Unity3d播放RTSP/RTMP流
  7. 安卓端/iOS端如何播放4K分辨率的RTMP/RTSP流
  8. mysql事务回滚后,自增ID仍然增加
  9. 学习Spring Boot:(十一) 自定义装配参数
  10. flash调用swf文件服务器,浏览器如何加载Flash文件? (SWF)