news 2026/4/16 11:07:51

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/4/15 9:56:27

FaceFusion人脸融合延迟优化技巧:减少Token空等时间

FaceFusion人脸融合延迟优化技巧&#xff1a;减少Token空等时间在如今实时视觉交互日益普及的背景下&#xff0c;AI换脸技术早已从实验室走向消费级应用。无论是虚拟主播、社交滤镜&#xff0c;还是影视后期制作&#xff0c;人脸融合系统对响应速度的要求越来越高。FaceFusion …

作者头像 李华
网站建设 2026/4/15 9:54:59

FaceFusion能否用于法律援助?证人身份匿名化处理

FaceFusion能否用于法律援助&#xff1f;证人身份匿名化处理在涉及性侵、家暴或有组织犯罪的庭审现场&#xff0c;一个戴着面具、声音经过变调处理的证人站在镜头前——这曾是司法系统为保护弱势群体所能提供的“极限方案”。画面模糊、表情缺失、情感传递断裂&#xff0c;法官…

作者头像 李华
网站建设 2026/4/15 9:55:00

FaceFusion能否用于商业项目?授权协议全面解读

FaceFusion能否用于商业项目&#xff1f;授权协议全面解读 在数字内容创作和AI生成技术迅猛发展的今天&#xff0c;人脸融合工具已成为影视、娱乐、社交应用中的关键技术组件。FaceFusion 作为一款功能强大且用户友好的开源换脸工具&#xff0c;凭借其高质量的人脸重建能力与模…

作者头像 李华
网站建设 2026/4/10 19:54:49

FaceFusion镜像提供沙箱环境,确保系统安全隔离

FaceFusion镜像提供沙箱环境&#xff0c;确保系统安全隔离在当今AI技术迅猛发展的背景下&#xff0c;图像处理与深度合成工具逐渐走入大众视野。其中&#xff0c;FaceFusion作为一款广受关注的AI换脸工具&#xff0c;凭借其高精度的人脸替换能力和流畅的推理性能&#xff0c;被…

作者头像 李华
网站建设 2026/4/14 6:45:37

FaceFusion镜像支持批量处理,提升内容生产效率

FaceFusion镜像支持批量处理&#xff0c;提升内容生产效率 在短视频日更千条、数字人直播带货成常态的今天&#xff0c;内容创作者正面临前所未有的效率压力。一个15秒的变脸视频&#xff0c;背后可能是上万帧图像的逐帧处理&#xff1b;一部老电影修复项目&#xff0c;动辄涉及…

作者头像 李华
网站建设 2026/4/15 16:03:20

FaceFusion能否用于农业监测?牲畜面部识别跟踪

FaceFusion能否用于农业监测&#xff1f;牲畜面部识别跟踪在内蒙古的广阔草原上&#xff0c;牧民依然靠经验和眼力辨认成百上千头牛羊。一旦有牲畜走失或生病&#xff0c;往往要等到明显消瘦、离群或无法行走时才被发现——那时已错过最佳干预时机。与此同时&#xff0c;在千里…

作者头像 李华