8 Interrpt和IsInterrupted
8 Interrpt()和IsInterrupted()
interrupt()的效果
如果被打断线程正在 sleep,wait,join 会导致被打断的线程抛出 InterruptedException,并清除 打断标记;如果打断的正在运行的线程,则会设置 打断标记;park 的线程被打断,也会设置 打断标记。
IsInterrupted()的效果
判断是否被打断,不会清除 打断标记。
总结
简而言之,interrupt()打断的如果是sleep,wait,join 这几个方法,IsInterrupted()显示的结果是false,即没有打断标记,并且会进入 InterruptedException异常。interrupt()如果打断的是正在运行的线程,那么不会真正的打断正在运行的线程,会把打断标记设置为true,表示该线程被打断了。同时,调用该线程的IsInterrupted()方法会返回true。
两阶段终止模式实例
import java.util.concurrent.TimeUnit; public class Interrupted2 { public static void main(String[] args) throws InterruptedException { TwoPhaseTermination tpt = new TwoPhaseTermination(); tpt.start(); TimeUnit.SECONDS.sleep(3); tpt.stop(); } } //两阶段终止模式 class TwoPhaseTermination { private Thread monitor; public void start() { monitor = new Thread(() -> { while (true) { Thread current = Thread.currentThread(); //初始值为false boolean flag = current.isInterrupted(); if (flag) { System.out.println("料理后事"); break; } try { TimeUnit.SECONDS.sleep(1); System.out.println("执行监控记录"); } catch (InterruptedException e) { e.printStackTrace(); //重新设置打断标记 //current.interrupt() 如果被打断线程正在 sleep,wait,ioin 会导致被打断的线程抛出 InterruptedException, // 并清除 打断标记;如果打断的正在运行的线程,则会设置 打断标记;park 的线程被打断,也会设置 打断标记 current.interrupt(); System.out.println(current.isInterrupted()); } } }); monitor.start(); } public void stop(){ //interrupt(); 只是做了打断标记,并不是真的强制终止线程执行(但是会进入InterruptedException异常) //修改中断标志位,并将调用该方法时程序所处的线程退出阻塞状态,此时会通知到被标记的线程并且调用阻塞处会接受到InterruptedException异常。 // 这里的阻塞比如是调用了sleep,wait,join方法,线程在等待同步锁的过程不属于本阻塞范畴。 monitor.interrupt(); } }
执行结果:
执行监控记录
执行监控记录
java.lang.InterruptedException: sleep interrupted
at java.lang.Thread.sleep(Native Method)
at java.lang.Thread.sleep(Thread.java:340)
at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:386)
at com.miao.juc.day1.TwoPhaseTermination.lambda$start$0(Interrupted2.java:32)
at java.lang.Thread.run(Thread.java:748)
true
料理后事
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗