这篇文章将介绍Java中线程中断的概念以及如何使用中断来终止线程执行。在Java中,有两种方式可以中断线程的执行:一种是通过设置标志位的方式,让线程在一个循环中判断标志位是否为true,从而终止线程执行;另一种则是通过调用线程的interrupt()方法来向线程发送中断信号,让线程自己判断是否要响应中断信号,如果要响应,则线程会抛出InterruptedException异常.
线程中断的概念
线程中断是指一个线程被另一个线程中断执行的状态. 对于一个线程的中断,可以通过调用该线程的 interrupt() 方法来请求中断该线程的执行。当一个线程在被中断执行时,它有以下两种响应方式:
-
忽略中断:当线程被中断执行时,它可以选择忽略该中断并继续执行,这样不会产生任何效果.
-
响应中断:当线程被中断执行时,它可以选择响应该中断并抛出InterruptedException异常,然后退出线程执行.
下面是一个示例说明:
public class InterruptExample1 {
public static void main(String[] args) throws InterruptedException {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
int count = 0;
while (!Thread.currentThread().isInterrupted()) {
count++;
}
System.out.println("线程被中断,count:" + count);
}
});
t.start();
Thread.sleep(1000);
t.interrupt();
}
}
在该示例中,我们创建了一个线程t并启动。在线程执行的时候,我们使用while循环来判断线程执行的状态是否被中断。如果线程没有被中断,则计数器count自增;如果线程被中断,则打印计数器count的值。在main函数中,我们等待线程执行1秒钟之后,调用线程t的interrupt()方法来中断线程执行。运行结果如下:
线程被中断,count:130485799
可以看到,在线程执行的过程中,我们调用了线程t的interrupt()方法来中断线程的执行,而在线程的执行中,我们通过isInterrupted()方法来判断线程是否被中断,从而做出不同的响应.
interrupt()方法的异常处理
当一个线程调用了interrupt()方法之后,该线程会收到一个中断信号。在接收到中断信号之后,线程可以选择忽略中断信号并继续执行,也可以选择响应中断信号并退出线程执行。如果线程选择响应中断信号,则会抛出一个InterruptedException异常.
在处理InterruptedException异常时,线程可以选择忽略异常并继续执行,也可以选择处理异常并退出线程执行.
下面是一个示例说明:
public class InterruptExample2 {
public static void main(String[] args) throws InterruptedException {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("线程开始执行");
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
System.out.println("线程收到中断信号,异常信息:" + e.getMessage());
}
System.out.println("线程结束执行");
}
});
t.start();
Thread.sleep(5000);
t.interrupt();
}
}
在该示例中,我们创建了一个线程t并启动。在线程执行中,我们调用了Thread.sleep()方法来让线程休眠10秒钟。在main函数中,我们等待线程执行5秒钟之后,调用线程t的interrupt()方法来中断线程执行。在线程的执行中,如果接收到中断信号,则会抛出一个InterruptedException异常,我们在异常处理中打印异常信息,然后退出线程执行. 运行结果如下:
线程开始执行
线程收到中断信号,异常信息:Sleep interrupted
线程结束执行
从输出结果可以看到,线程在执行的过程中,接收到了来自主线程的中断信号,整个执行过程被中断并退出.
在实际应用中,我们需要根据具体情况选择是否忽略或处理InterruptedException异常.
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java并发编程示例(三):线程中断 - Python技术站