先给大家介绍一下这篇攻略的目录:
目录
- Java多线程中断机制简介
- interrupt()方法
- 示例1:线程在睡眠时被中断
- 示例2:线程使用while循环时被中断
- isInterrupted()方法
- 示例3:判断是否被中断
- interrupted()方法
- 示例4:判断是否被中断并清除中断标志位
现在我们来一步步讲解每个部分的内容。
Java多线程中断机制简介
在Java多线程中,由于线程是一个并发的执行单元,线程间的一些操作可能会相互影响。而线程中断机制是为了使线程之间的相互影响能够更灵活,让一个线程在有需要的时候,可以打断另一个正在执行的线程。Java线程中断机制主要有3个方法:interrupt()、isInterrupted()、interrupted()。
interrupt()方法
调用线程的interrupt()方法可以中断线程。具体地说,当调用线程的interrupt()方法时,如果该线程正在阻塞于wait()、join()、sleep()方法调用中,则该方法会抛出InterruptedException异常,同时清除该线程的中断状态(将中断标志位设置为false)。此时,线程可以选择处理异常,或者继续抛出该异常。
同时需要注意,当调用线程的interrupt()方法时,如果该线程未被阻塞,仅仅是被设置了中断标志位,那么该方法只是将该线程的中断标志位置为true,并不会中断该线程的执行。所以需要在线程中判断这个中断标志位,以决定是否中断线程的执行。
示例1:线程在睡眠时被中断
public class ThreadInterrupt implements Runnable {
public void run() {
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
System.out.println("线程被中断");
}
}
public static void main(String[] args) {
Thread t = new Thread(new ThreadInterrupt());
t.start();
t.interrupt();
}
}
在上面的示例中,创建了一个线程t,它的任务是睡眠10秒钟。在main函数中,产生了一个新线程,并启动了它。之后,又调用了该线程的interrupt()方法,使该线程被中断。由于该线程在睡眠中,所以调用interrupt()方法之后会抛出InterruptedException异常,并触发finally块代码。在finally块中,输出“线程被中断”。
示例2:线程使用while循环时被中断
public class ThreadInterrupt implements Runnable {
static boolean flag = true;
public void run() {
while (flag) {
System.out.println("线程执行中...");
}
System.out.println("线程结束");
}
public static void main(String[] args) {
Thread t = new Thread(new ThreadInterrupt());
t.start();
t.interrupt();
flag = false;
}
}
上面的示例中,创建了一个线程t,它的任务是执行while循环,一直输出“线程执行中...”。在main函数中,产生了一个新线程,并启动了它。之后,又调用了该线程的interrupt()方法,使该线程被中断。由于该线程正在执行中,所以在线程中需要判断中断标志位,以决定是否中断线程的执行,所以将while循环设置为判断flag变量的布尔值。运行这个程序,应该会看到输出“线程被中断”和“线程结束”这两个信息。
isInterrupted()方法
isInterrupted()方法用来判断一个线程是否被中断。如果调用该方法时,线程的中断标志位被设置为true,那么返回true;否则,返回false。
需要注意的是,调用isInterrupted()方法并不会清除线程的中断状态,也就是说,如果一个线程的中断标志位被设置为true,那么在任何时候都可以调用isInterrupted()方法来判断这个状态。
示例3:判断是否被中断
public class ThreadInterrupt implements Runnable {
public void run() {
while (!Thread.currentThread().isInterrupted()) {
System.out.println("线程执行中...");
}
System.out.println("线程被中断");
}
public static void main(String[] args) {
Thread t = new Thread(new ThreadInterrupt());
t.start();
t.interrupt();
}
}
在上面的示例中,创建了一个线程t,它的任务是执行while循环,输出“线程执行中...”。在while循环的判断条件中,调用了Thread.currentThread().isInterrupted()方法,判断该线程是否被中断。在main函数中,先启动线程t,之后调用了该线程的interrupt()方法,使该线程的中断标志位被设置为true。而在循环中,每次都检查线程的中断标志位,如果被设置为true,则跳出循环,输出“线程被中断”。
interrupted()方法
interrupted()方法既可以判断一个线程是否被中断,还可以清除线程的中断状态,即将中断标志位设置为false。需要注意的是,如果调用interrupted()方法时,该线程的中断标志位为false,则该方法返回false,并不会将中断标志位设置为false。
示例4:判断是否被中断并清除中断标志位
public class ThreadInterrupt implements Runnable {
public void run() {
while (!Thread.interrupted()) {
System.out.println("线程执行中...");
}
System.out.println("线程被中断");
}
public static void main(String[] args) {
Thread t = new Thread(new ThreadInterrupt());
t.start();
t.interrupt();
}
}
在上面的示例中,创建了一个线程t,它的任务是执行while循环,输出“线程执行中...”。在while循环的判断条件中,调用了Thread.interrupted()方法,判断该线程是否被中断,并清除中断标志位。在main函数中,先启动线程t,之后调用了该线程的interrupt()方法,使该线程的中断标志位被设置为true。而在循环中,每次都检查线程的中断标志位,并清除中断标志位,如果被设置为true,则跳出循环,输出“线程被中断”。
那么,以上就是本篇攻略的全部内容,希望这篇攻略对读者有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java多线程中断机制三种方法及示例 - Python技术站