当前位置: 首页 > news >正文

如何优雅终止线程/线程池

如何优雅终止线程

分为两个阶段终止线程
1、interrupted(): 让线程从休眠状态转换到RUNNABLE 状态
2、线程终止的标志位:线程会在合适的时机检查这个标志位,如果发现符合终止条件,则自动退出 run() 方法

public class MonitorThread extends Thread {//在监控线程中添加一个volatile类型的标志变量,用于标识是否需要终止线程的执行private volatile boolean terminated = false;public void run() {while (!terminated) {// 执行监控操作System.out.println("监控线程正在执行监控操作...");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}// 执行清理操作System.out.println("监控线程正在执行清理操作...");releaseResources();}public void terminate() {//设置标志变量为true,并等待一段时间terminated = true;try {join(5000); // 等待5秒钟,期间监控线程会检查terminated的状态} catch (InterruptedException e) {e.printStackTrace();}}private void releaseResources() {// 释放资源和进行必要的清理工作System.out.println("监控线程正在释放资源和进行必要的清理工作...");}public static void main(String[] args) throws InterruptedException {MonitorThread thread = new MonitorThread();//启动监控线程thread.start();//主线程休眠期间,监控线程在执行监控操作Thread.sleep(10000);//终止监控线程thread.terminate();Thread.sleep(100000);}
}

如何优雅终止线程池

线程池有两个终止线程池API:shutdownNow()、shotdown()
1、shotdown :会停止线程池接受新的任务,并等待线程池中的所有任务执行完毕,然后关闭线程池。。在调用shutdown()方法后,线程池不再接受新的任务,但是会将任务队列中的任务继续执行直到队列为空。如果线程池中的任务正在执行,但是还没有执行完毕,线程池会等待所有任务执行完毕后再关闭线程池。
2、shutdownNow:会停止线程池接受新的任务,并尝试中断正在执行任务的线程,然后关闭线程池。在调用shutdownNow()方法后,线程池不再接受新的任务,同时会中断正在执行任务的线程并返回一个未执行的任务列表
3、awaitTerminal等待线程池中的任务执行完毕,或者超时时间到达

 public static void main(String[] args) throws InterruptedException {ExecutorService executorService = Executors.newFixedThreadPool(5);for (int i = 0; i < 10; i++) {executorService.submit(() -> {try {// 执行任务操作System.out.println(Thread.currentThread().getName() + "正在执行任务...");Thread.sleep(5000);} catch (InterruptedException e) {// 重新设置中断状态Thread.currentThread().interrupt();e.printStackTrace();} finally {System.out.println(Thread.currentThread().getName() + "任务执行完毕");}});}// 停止线程池接受新的任务,但不能强制停止已经提交的任务executorService.shutdown();// 等待线程池中的任务执行完毕,或者超时时间到达boolean terminated = executorService.awaitTermination(3, TimeUnit.SECONDS);if (!terminated) {// 如果线程池中还有未执行完毕的任务,则调用线程池的shutdownNow方法,中断所有正在执行的任务// 如果有还没开始执行的任务,则返回未执行的任务列表List<Runnable> tasks = executorService.shutdownNow();System.out.println("剩余未执行的任务数:" + tasks.size());}}
http://www.lryc.cn/news/384668.html

相关文章:

  • 泰迪智能科技实验室产品-云计算资源管理平台介绍
  • .Net WebApi启动 Swagger异常报错: Failed to load API definition
  • CSS新手入门笔记【导入方法、选择器介绍、选择器优先级、属性详细介绍、盒子模型】
  • 制作高校专属PPT时,如何将校徽设置成透明底色?无须PS
  • 设计模式之【适配器模式】
  • AI论文降重:一键操作,让你的论文查重率瞬间下降
  • Cmake--学习笔记
  • LangChain让LLM带上记忆
  • Word恢复历史文档,记好4个方法就足够
  • 收银系统源码-千呼新零售2.0【线上营销】
  • OnlyOffice测评
  • UDS - 8 Application layer protocol
  • 二叉树公共最近祖先
  • 智慧运维系统指导规范
  • 最新自助下单彩虹云商城系统源码,含小储云商城模板免授权
  • 头条系统-05-延迟队列精准发布文章-概述添加任务(db和redis实现延迟任务)、取消拉取任务定时刷新(redis管道、分布式锁setNx)
  • .gitignore git添加忽略文件
  • 面向遥感图像的多阶段特征融合目标检测方法
  • 操作系统面试篇一
  • OPenFast软件中的NRELOffshrBsline5MW_Onshore_ServoDyn.dat文件详解
  • 搭建rtmp/rtsp流媒体服务器的步骤
  • vue自定义事件传递数据
  • TensorBoard 安装与启动
  • 云计算运维工程师的突发状况处理
  • 【CSS in Depth 2 精译】1.6 本章小结
  • FFmpeg源码:ff_h2645_extract_rbsp函数分析
  • 关于 AD21导入电子元器件放置“3D体”STEP模型失去3D纹理贴图 的解决方法
  • 【JAVA】利用Redisson和Spring实现高效物联温度控制链路,确保温度调节的准确性和效率,定时链路执行使用案例,一环扣一环
  • yolov8部署资料
  • 迅为RK3588开发板支持LVDS信号,标准 HDMI信号,IMIPI信号