Java 中断线程的几种方式 interrupt()详解
在 Java 中,一条线程可以通过另一条线程中断,可以说是线程通信的一种方式。本文将会详细的讲解 Java 中线程中断的几种方式以及如何检测线程是否被中断。
interrupt() 方法
Java 提供了 interrupt() 方法作为一种中断线程的方式,在线程启动后,可以使用该方法将线程设置为中断状态。此时线程就可以根据自己的需要作出相应的处理。
比如,假设我们有一条线程在等待某个输入,但是在等待的过程中,我们希望用户可以终止该线程并结束整个程序,那么就可以在我们需要中断线程的时候,使用 interrupt() 方法将其设置为中断状态。
这里需要注意的是,通过 interrupt() 方法设置线程为中断状态并不意味着它会立即停止工作,它仅仅是告诉该线程,可以作出相应的响应了。如果线程的 code 中没有对中断做响应,则什么也不会发生。下面我们来看几个中断线程的方式:
中断处于阻塞状态的线程
处于阻塞状态的线程可以通过 interrupt() 方法跳出阻塞状态。例如,如果一个线程正在等待 I/O 操作完成或等待获取一个锁,此时我们中断该线程,则它将抛出一个 InterruptException 异常来允许该线程退出阻塞状态。
示例代码:
public class TestInterrupt {
public static void main(String[] args) throws InterruptedException {
Thread myThread = new Thread(() -> {
try {
// 等待获取锁
synchronized(TestInterrupt.class) {
TestInterrupt.class.wait();
}
} catch (InterruptedException e) {
System.out.println(Thread.currentThread().getName() + " 被中断了!");
}
});
myThread.start();
Thread.sleep(2000L);
// 中断 myThread 线程
myThread.interrupt();
}
}
运行该代码,我们可以看到输出的信息:Thread-0 被中断了!
,表示该线程已被成功中断。
检测线程是否被中断
在本示例中,我们使用了 isInterrupted() 方法来查看线程是否被中断。如果该方法返回 true,则表示线程已经被中断了。
示例代码:
public class TestInterrupt {
public static void main(String[] args) {
Thread myThread = new Thread(() -> {
while (!Thread.currentThread().isInterrupted()) {
System.out.println("线程正在运行...");
}
System.out.println("线程被中断了!");
});
myThread.start();
// 中断线程
myThread.interrupt();
}
}
输出的结果应该如下:
线程正在运行...
线程正在运行...
线程正在运行...
线程被中断了!
在上面的代码中,我们首先启动一个线程,然后在该线程中使用了一个 while 循环,不断检查该线程是否被中断。当线程被中断时,跳出循环并打印日志。
sleep() 和 join() 方法的中断
在使用 sleep() 和 join() 方法使线程处于阻塞状态时,如果线程在等待过程中被中断,则它会立即抛出 InterruptedException 异常,以唤醒线程并退出阻塞状态。
这种情况也需要使用 try-catch 语句来捕获异常,以确保线程可以进行正常的工作。
示例代码:
public class TestInterrupt {
public static void main(String[] args) throws InterruptedException {
Thread myThread = new Thread(() -> {
try {
// 线程休眠5秒
Thread.sleep(5000L);
} catch (InterruptedException e) {
System.out.println(Thread.currentThread().getName() + " 被中断!");
}
});
myThread.start();
Thread.sleep(2000L);
// 中断线程
myThread.interrupt();
}
}
注意,在上面的代码中,线程休眠的时间为 5 秒钟。我们需要等待一段时间以确保线程已经处于休眠状态。如果我们不加等待直接执行 myThread.interrupt(),则线程可能还没有进入睡眠状态,从而没有被中断。
结论
通过本文,我们了解了 Java 中通过 interrupt() 方法中断线程的几种方式:中断处于阻塞状态的线程、检测线程是否被中断,sleep() 方法和 join() 方法的中断。
在实际应用中,我们可以根据我们的需求使用适当的方式来中断线程,以确保线程可以正常的停止、释放资源,并且确保我们设计的算法是正确的。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java 中断线程的几种方式 interrupt()详解 - Python技术站