我們可以通過使用interrupt()方法中斷一個活動的線程。
這個方法調(diào)用在線程只是一個指示。它是由線程如何響應(yīng)中斷。
下面的代碼顯示了中斷主線程并打印線程中斷狀態(tài)的代碼。
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()); } }
上面的代碼生成以下結(jié)果。
下面的代碼如何一個線程將中斷另一個線程。
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); } }
上面的代碼生成以下結(jié)果。
Thread類有一個非靜態(tài)的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()); } }
上面的代碼生成以下結(jié)果。
你可以中斷一個被阻塞的線程。
如果在這三種方法上阻塞的線程被中斷,則拋出一個InterruptedException,并清除線程的中斷狀態(tài)。
以下代碼啟動一個休眠一秒的線程,并打印一條消息,直到它被中斷。
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!");
}
}
}
}
上面的代碼生成以下結(jié)果。
更多建議: