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!");
}
}
}
}
尝试一下
上面的代码生成以下结果。




















