Java多线程教程:Thread 中断(interrupt)
原创大约 2 分钟
Java多线程教程:Thread 中断(interrupt)
Java中的interrupt
方法用于中断当前运行的线程。该方法将线程的中断状态设置为true
。如果线程处于阻塞状态(如等待、睡眠或I/O阻塞),则会抛出InterruptedException
。被中断的线程可以捕获该异常并采取相应措施。
目录
- 如何中断线程
- 检查中断状态
- 处理
InterruptedException
- 中断线程示例
- 处理睡眠线程中断示例
- 结论
1. 如何中断线程
通过调用线程实例的interrupt
方法中断线程:
public void interrupt()
2. 检查中断状态
使用isInterrupted
方法或静态的Thread.interrupted
方法检查中断状态:
public boolean isInterrupted() // 检查中断状态但不清除
public static boolean interrupted() // 检查并清除中断状态
InterruptedException
3. 处理当线程在阻塞状态下被中断时(如睡眠或等待),会抛出InterruptedException
,需使用try-catch
块处理。
4. 中断线程示例
class MyThread extends Thread {
public MyThread(String name) {
super(name); // 设置线程名称
}
@Override
public void run() {
while (!isInterrupted()) {
System.out.println(Thread.currentThread().getName() + "正在运行");
try {
Thread.sleep(1000); // 休眠1秒
} catch (InterruptedException e) {
System.out.println(Thread.currentThread().getName() + "在睡眠中被中断");
interrupt(); // 重新设置中断状态
}
}
System.out.println(Thread.currentThread().getName() + "已结束");
}
public static void main(String[] args) {
MyThread t1 = new MyThread("线程-1");
t1.start();
try {
Thread.sleep(3000); // 主线程休眠3秒
} catch (InterruptedException e) {
e.printStackTrace();
}
t1.interrupt(); // 中断线程1
}
}
输出:
线程-1正在运行
线程-1正在运行
线程-1正在运行
线程-1在睡眠中被中断
线程-1已结束
5. 处理睡眠线程中断示例
class MyThread extends Thread {
public MyThread(String name) {
super(name);
}
@Override
public void run() {
for (int i = 0; i < 5; i++) {
if (isInterrupted()) {
System.out.println(Thread.currentThread().getName() + "被中断");
break;
}
System.out.println(Thread.currentThread().getName() + "运行中,迭代:" + i);
try {
Thread.sleep(1000); // 休眠1秒
} catch (InterruptedException e) {
System.out.println(Thread.currentThread().getName() + "在睡眠中被中断");
break;
}
}
System.out.println(Thread.currentThread().getName() + "已结束");
}
public static void main(String[] args) {
MyThread t1 = new MyThread("线程-1");
t1.start();
try {
Thread.sleep(3000); // 主线程休眠3秒
} catch (InterruptedException e) {
e.printStackTrace();
}
t1.interrupt(); // 中断线程1
}
}
输出:
线程-1运行中,迭代:0
线程-1运行中,迭代:1
线程-1运行中,迭代:2
线程-1在睡眠中被中断
线程-1已结束
6. 结论
Java的interrupt
方法用于控制线程执行流程。通过interrupt
、isInterrupted
和interrupted
方法,可以优雅地处理线程中断。正确处理InterruptedException
能确保线程在各种条件下可控地响应中断,使应用程序行为符合预期。