interrupt 中断线程
一、线程该如何停止
- 线程在执行完代码后可以自行停止
- 在线程运行时可以使用线程对象进行中断请求,使用interrupt方法设置线程请求中断状态,线程可以根据请求中断状态来判断自己是否需要响应中断请求,该如何响应中断请求。
二、线程请求中断后不一定需要停止
线程接收到了中断请求之后,可以自行处理中断请求,可以停止线程,也可以继续执行其他操作
三、线程中断 interrupt 详解
- interrupt()是Thread类的一个方法,thread.interrupt()会将中断状态设置为true;
- Thread.currentThread().isInterrupted() 获取当前中断状态状态
- 在执行该方法之后,会返回中断状态,并且重置中断状态为false
- 线程请求中断之后,有两种情况会触发中断响应
- 在线程中判断是否发生了中断,进行响应
- 在sleep,wait时发生了请求中断,将会抛出异常,并且程序继续执行
- 被中断线程可以自行决定如何处理中断
四、代码示例
package com.wujie.thread.interrupt;
/**
* 中断线程
* 线程调用 interrupt 方法,会修改线程的中断状态
* 线程在运行的过程中可以判断中断状态进行线程终止或者别的操作
*
* 线程请求中断之后,有两种情况会触发中断响应
* 1. 在线程中判断是否发生了中断,进行响应
* 2. 在sleep,wait时发生了请求中断,将会抛出异常,并且程序继续执行
* 被中断线程可以自行决定如何处理中断
*
*/
public class Interrupt {
public static void main(String[] args) throws InterruptedException {
MyThread myThread = new MyThread();
myThread.start();
myThread.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread t, Throwable e) {
System.out.println("发生了异常");
e.printStackTrace();
}
});
Thread.sleep(2000);
myThread.interrupt();
}
}
class MyThread extends Thread {
@Override
public void run() {
for (;;) {
// 在 run 方法中 sleep 需要捕获 InterruptedException
// 在 sleep 时,线程进行设置中断状态,会导致 sleep 停止,抛出异常,并继续向下执行
try {
System.out.println("开始睡眠...");
sleep(1000);
System.out.println("结束睡眠...");
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("我正在运行...");
// 判断是否有中断请求
if (Thread.currentThread().isInterrupted()) {
System.out.println("我需要去做一些事情:比如停止或者去做别的事情");
}
// int x = 1 / 0;
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端