Java Thread类的interrupt()方法(附带实例)
在 Java 程序中,interrupt() 方法用来中断一个线程。
与线程的 stop() 方法不同,interrupt() 方法旨在通过一种通知机制,为线程的中断过程带来缓冲,避免因强制中断一个线程而带来各类问题。
Java通过为每个线程对象提供一个中断标识来实现这种通知机制。简单来说,interrupt() 方法的作用是修改该线程的中断标识,通知该线程应该被中断了,而不是实际中断该线程。
一个处于正常运行状态下的线程应该在运行过程中周期性地检查其自身的中断标识,如果发现中断标识被设置为 true,就应该有序地释放线程占用的资源,并中断该线程的运行。
值得注意的是,这里提到的周期性检查自身的中断标识、有序释放资源、中断线程运行的操作,均需要开发者通过编写代码来实现。也就是说,如果开发者没有提供这些代码,那么调用一个线程对象的 interrupt() 方法,仅会修改该线程对象的中断标识,不会实际中断该线程。
对于一个处于阻塞状态的线程(如因 sleep、wait 和 join 等操作而处于阻塞状态),调用它的 interrupt() 方法会使该线程立刻退出阻塞状态,并抛出一个 InterruptedException 异常,可以理解为中断这个线程的阻塞状态。开发者可以使用 try-catch 语句块捕获 InterruptedException 异常,并在 catch 语句块中提供实际中断该线程的代码。
与 interrupt() 方法相关的方法还有 interrupted() 和 isInterrupted():
【实例】中断线程的应用。
与线程的 stop() 方法不同,interrupt() 方法旨在通过一种通知机制,为线程的中断过程带来缓冲,避免因强制中断一个线程而带来各类问题。
Java通过为每个线程对象提供一个中断标识来实现这种通知机制。简单来说,interrupt() 方法的作用是修改该线程的中断标识,通知该线程应该被中断了,而不是实际中断该线程。
一个处于正常运行状态下的线程应该在运行过程中周期性地检查其自身的中断标识,如果发现中断标识被设置为 true,就应该有序地释放线程占用的资源,并中断该线程的运行。
值得注意的是,这里提到的周期性检查自身的中断标识、有序释放资源、中断线程运行的操作,均需要开发者通过编写代码来实现。也就是说,如果开发者没有提供这些代码,那么调用一个线程对象的 interrupt() 方法,仅会修改该线程对象的中断标识,不会实际中断该线程。
对于一个处于阻塞状态的线程(如因 sleep、wait 和 join 等操作而处于阻塞状态),调用它的 interrupt() 方法会使该线程立刻退出阻塞状态,并抛出一个 InterruptedException 异常,可以理解为中断这个线程的阻塞状态。开发者可以使用 try-catch 语句块捕获 InterruptedException 异常,并在 catch 语句块中提供实际中断该线程的代码。
与 interrupt() 方法相关的方法还有 interrupted() 和 isInterrupted():
- interrupted()方法:用于测试当前线程是否已经中断(静态方法)。如果连续调用该方法,那么第二次调用将返回 false。interrupted() 方法具有将状态标识设置为 false 的功能;
- isInterrupted()方法:用于测试线程是否已经中断,但是不能清除状态标识。
【实例】中断线程的应用。
public class Example { public static void main(String args[]) { Thread thread = new Thread(new Runnable() { public void run() { System.out.println("线程启动了"); try { Thread.sleep(1000 * 100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("线程结束了"); } }); thread.start(); try { Thread.sleep(1000 * 5); } catch (InterruptedException e) { e.printStackTrace(); } // 在线程阻塞时抛出一个中断信号 // 这样线程就得以退出阻塞状态 thread.interrupt(); } }运行结果为:
线程启动了 java.lang.InterruptedException: sleep interrupted at java.lang.Thread.sleep(Native Method) at chapter12.Example12_8$1.run(Example12_8.java:9) <1 internal line> 线程结束了