Java线程教程 - Java线程中断
我们可以通过使用interrupt()方法中断一个活动的线程。
这个方法调用在线程只是一个指示。它是由线程如何响应中断。
例子
下面的代码显示了中断主线程并打印线程中断状态的代码。
public class Main { public static void main(String[] args) { System.out.println("#1:" + Thread.interrupted()); // Now interrupt the main thread Thread.currentThread().interrupt(); // Check if it has been interrupted System.out.println("#2:" + Thread.interrupted()); // Check again if it has been interrupted System.out.println("#3:" + Thread.interrupted()); } }
上面的代码生成以下结果。
例2
下面的代码如何一个线程将中断另一个线程。
public class Main { public static void main(String[] args) { Thread t = new Thread(Main::run); t.start(); try { Thread.currentThread().sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } t.interrupt(); } public static void run() { int counter = 0; while (!Thread.interrupted()) { counter++; } System.out.println("Counter:" + counter); } }
上面的代码生成以下结果。
例3
Thread类有一个非静态的isInterrupted()方法,可以用来测试一个线程是否被中断。
public class Main { public static void main(String[] args) { System.out.println("#1:" + Thread.interrupted()); Thread mainThread = Thread.currentThread(); mainThread.interrupt(); System.out.println("#2:" + mainThread.isInterrupted()); System.out.println("#3:" + mainThread.isInterrupted()); System.out.println("#4:" + Thread.interrupted()); System.out.println("#5:" + mainThread.isInterrupted()); } }
上面的代码生成以下结果。
例4
你可以中断一个被阻塞的线程。
如果在这三种方法上阻塞的线程被中断,则抛出一个InterruptedException,并清除线程的中断状态。
以下代码启动一个休眠一秒的线程,并打印一条消息,直到它被中断。
public class Main {
public static void main(String[] args) throws InterruptedException{
Thread t = new Thread(Main::run);
t.start();
Thread.sleep(5000);
t.interrupt();
}
public static void run() {
int counter = 1;
while (true) {
try {
Thread.sleep(1000);
System.out.println("Counter:" + counter++);
} catch (InterruptedException e) {
System.out.println("I got interrupted!");
}
}
}
}
尝试一下
上面的代码生成以下结果。