news 2026/7/7 21:01:04

Java 多线程编程 - 线程池任务终止分析(线程池任务终止、中断的本质、检查中断)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java 多线程编程 - 线程池任务终止分析(线程池任务终止、中断的本质、检查中断)

一、线程池任务终止

  1. shutdown():等当前任务完成,然后停止
ScheduledExecutorServicescheduler=Executors.newScheduledThreadPool(1);// 启动任务,初始延迟 0 秒,每次执行完后延迟 1 秒再执行下一次ScheduledFuture<?>future=scheduler.scheduleWithFixedDelay(()->{try{System.out.println("任务开始执行");Thread.sleep(5*1000);System.out.println("任务执行完成");}catch(InterruptedExceptione){System.out.println("任务被中断");}},0,1,TimeUnit.SECONDS);try{Thread.sleep(2*1000);}catch(InterruptedExceptione){e.printStackTrace();}scheduler.shutdown();
# 输出结果 任务开始执行 任务执行完成
  1. cancel(true) + shutdown():立即中断当前任务,然后停止
ScheduledExecutorServicescheduler=Executors.newScheduledThreadPool(1);// 启动任务,初始延迟 0 秒,每次执行完后延迟 1 秒再执行下一次ScheduledFuture<?>future=scheduler.scheduleWithFixedDelay(()->{try{System.out.println("任务开始执行");Thread.sleep(5*1000);System.out.println("任务执行完成");}catch(InterruptedExceptione){System.out.println("任务被中断");}},0,1,TimeUnit.SECONDS);try{Thread.sleep(2*1000);}catch(InterruptedExceptione){e.printStackTrace();}future.cancel(true);scheduler.shutdown();
# 输出结果 任务开始执行 任务被中断
  1. shutdownNow():立即中断所有任务,然后停止
ScheduledExecutorServicescheduler=Executors.newScheduledThreadPool(1);// 启动任务,初始延迟 0 秒,每次执行完后延迟 1 秒再执行下一次ScheduledFuture<?>future=scheduler.scheduleWithFixedDelay(()->{try{System.out.println("任务开始执行");Thread.sleep(5*1000);System.out.println("任务执行完成");}catch(InterruptedExceptione){System.out.println("任务被中断");}},0,1,TimeUnit.SECONDS);try{Thread.sleep(2*1000);}catch(InterruptedExceptione){e.printStackTrace();}scheduler.shutdownNow();
# 输出结果 任务开始执行 任务被中断

二、中断的本质

  1. Java 中的中断机制是协作式的,而不是强制性的

  2. 上述案例中的中断是通过触发Thread.sleep()的 InterruptedException 来实现的

  3. 中断只是设置标志位,并不能强制打断任务,如下例

ScheduledExecutorServicescheduler=Executors.newScheduledThreadPool(1);// 启动任务,初始延迟 0 秒,每次执行完后延迟 1 秒再执行下一次ScheduledFuture<?>future=scheduler.scheduleWithFixedDelay(()->{try{System.out.println("任务开始执行");ServerSocketserverSocket=newServerSocket(9999);serverSocket.accept();System.out.println("任务执行完成");}catch(IOExceptione){e.printStackTrace();}},0,1,TimeUnit.SECONDS);try{Thread.sleep(2*1000);}catch(InterruptedExceptione){e.printStackTrace();}future.cancel(true);scheduler.shutdown();
  1. Thread.sleep()在抛出 InterruptedException 时会自动清除中断标志位
ScheduledExecutorServicescheduler=Executors.newScheduledThreadPool(1);// 启动任务,初始延迟 0 秒,每次执行完后延迟 1 秒再执行下一次ScheduledFuture<?>future=scheduler.scheduleWithFixedDelay(()->{try{System.out.println("任务开始执行");System.out.println("中断标志位:"+Thread.currentThread().isInterrupted());Thread.sleep(5*1000);System.out.println("任务执行完成");}catch(InterruptedExceptione){System.out.println("任务被中断");}finally{System.out.println("中断标志位:"+Thread.currentThread().isInterrupted());}},0,1,TimeUnit.SECONDS);try{Thread.sleep(2*1000);}catch(InterruptedExceptione){e.printStackTrace();}future.cancel(true);scheduler.shutdown();
# 输出结果 任务开始执行 中断标志位:false 任务被中断 中断标志位:false

三、检查中断

  1. shutdown():等当前任务完成,然后停止,中断标志位没有变化
ScheduledExecutorServicescheduler=Executors.newScheduledThreadPool(1);// 启动任务,初始延迟 0 秒,每次执行完后延迟 1 秒再执行下一次ScheduledFuture<?>future=scheduler.scheduleWithFixedDelay(()->{System.out.println("任务开始执行");System.out.println("中断标志位:"+Thread.currentThread().isInterrupted());Scannerscanner=newScanner(System.in);System.out.print("请输入一个整数:");intnum=scanner.nextInt();System.out.println("任务执行完成");System.out.println("中断标志位:"+Thread.currentThread().isInterrupted());},0,1,TimeUnit.SECONDS);try{Thread.sleep(2*1000);}catch(InterruptedExceptione){e.printStackTrace();}scheduler.shutdown();
# 输出结果 任务开始执行 中断标志位:false 请输入一个整数:12 任务执行完成 中断标志位:false
  1. cancel(true) + shutdown():立即中断当前任务,中断标志位会被设置为 true,然后停止
ScheduledExecutorServicescheduler=Executors.newScheduledThreadPool(1);// 启动任务,初始延迟 0 秒,每次执行完后延迟 1 秒再执行下一次ScheduledFuture<?>future=scheduler.scheduleWithFixedDelay(()->{System.out.println("任务开始执行");System.out.println("中断标志位:"+Thread.currentThread().isInterrupted());Scannerscanner=newScanner(System.in);System.out.print("请输入一个整数:");intnum=scanner.nextInt();System.out.println("任务执行完成");System.out.println("中断标志位:"+Thread.currentThread().isInterrupted());},0,1,TimeUnit.SECONDS);try{Thread.sleep(2*1000);}catch(InterruptedExceptione){e.printStackTrace();}future.cancel(true);scheduler.shutdown();
# 输出结果 任务开始执行 中断标志位:false 请输入一个整数:12 任务执行完成 中断标志位:true
  1. shutdownNow():立即中断所有任务,中断标志位会被设置为 true,然后停止
ScheduledExecutorServicescheduler=Executors.newScheduledThreadPool(1);// 启动任务,初始延迟 0 秒,每次执行完后延迟 1 秒再执行下一次ScheduledFuture<?>future=scheduler.scheduleWithFixedDelay(()->{System.out.println("任务开始执行");System.out.println("中断标志位:"+Thread.currentThread().isInterrupted());Scannerscanner=newScanner(System.in);System.out.print("请输入一个整数:");intnum=scanner.nextInt();System.out.println("任务执行完成");System.out.println("中断标志位:"+Thread.currentThread().isInterrupted());},0,1,TimeUnit.SECONDS);try{Thread.sleep(2*1000);}catch(InterruptedExceptione){e.printStackTrace();}scheduler.shutdownNow();
# 输出结果 任务开始执行 中断标志位:false 请输入一个整数:12 任务执行完成 中断标志位:true
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/7 10:33:11

FaceFusion能否识别戴口罩人脸?部分遮挡仍可定位

FaceFusion能否识别戴口罩人脸&#xff1f;部分遮挡仍可定位在机场安检口&#xff0c;一位戴着N95口罩的旅客走近人脸识别闸机。系统短暂卡顿后&#xff0c;屏幕亮起“身份验证通过”——这样的场景在过去几年中已从例外变为常态。随着公共场合佩戴口罩逐渐成为一种习惯性防护行…

作者头像 李华
网站建设 2026/7/7 12:17:03

FaceFusion镜像优化指南:提升处理速度与图像质量的秘诀

FaceFusion镜像优化指南&#xff1a;提升处理速度与图像质量的秘诀在AI内容生成迅速普及的今天&#xff0c;人脸融合技术正从实验室走向大众应用。无论是社交App中的趣味换脸、虚拟主播的实时驱动&#xff0c;还是影视后期的数字替身&#xff0c;用户对“快、真、稳”的需求从未…

作者头像 李华
网站建设 2026/7/6 21:20:10

FaceFusion是否依赖CUDA?AMD显卡用户怎么办?

FaceFusion是否依赖CUDA&#xff1f;AMD显卡用户怎么办&#xff1f; 在AI换脸技术迅速“破圈”的今天&#xff0c;越来越多的内容创作者、视频后期从业者甚至普通用户开始尝试使用像 FaceFusion 这样的开源工具来实现高质量的人脸替换。它以出色的画质还原、流畅的推理速度和…

作者头像 李华
网站建设 2026/7/7 8:44:34

FaceFusion集成先进算法,实现毫秒级人脸检测

FaceFusion&#xff1a;毫秒级人脸检测与高精度融合的工程实践 在流媒体内容爆炸式增长的今天&#xff0c;观众对视觉特效的期待早已从“能换脸”转向“换得自然、换得实时”。无论是短视频平台上的趣味滤镜&#xff0c;还是影视工业中复杂的数字替身制作&#xff0c;传统人脸替…

作者头像 李华
网站建设 2026/7/7 4:54:52

DFX测试:全生命周期质量保障

在测试指南中融入 DFX(Design for X,面向全生命周期设计)测试指导要求,核心是将 “设计阶段的可执行性要求” 转化为可验证的测试标准,确保产品在功能之外,满足全生命周期的质量目标(如可测试性、可维护性、可部署性等)。以下是结构化的 DFX 测试指导要求,涵盖核心维度…

作者头像 李华
网站建设 2026/7/7 17:16:16

FaceFusion能否处理竖屏短视频?适配手机拍摄比例

FaceFusion能否处理竖屏短视频&#xff1f;适配手机拍摄比例在抖音、快手和 Instagram Reels 上刷视频时&#xff0c;你有没有注意到——几乎所有内容都是竖着拍的&#xff1f;9:16 的画面里&#xff0c;人脸几乎占据了整个视觉中心。这种由智能手机主导的“自拍式构图”&#…

作者头像 李华