最近寫了些多線程的程序,用Thread.sleep()的時候有時會碰到InterruptedException。查了一些資料,下面是我自己的一些理解。
阻塞方法
一些多線程相關的方法是阻塞方法,比如Thread.sleep(), Thread.wait(), Thread.join()。
這些方法的執行通常需要比較長的時間來完成,當代碼執行到阻塞方法時,一般要等待該方法返回后
才能繼續往下執行,而InterruptedException提供了一種特殊的機制提前結束阻塞方法。
中斷變量
每個線程都會維護一個bool變量,表示線程處于中斷(true)或者非中斷狀態(false)。在線程初始的情況下中斷變量為false。
這個變量的bool值可以通過Thread.isInterrupted()方法來讀取,通過Thread.interrupted()方法來清除中斷(即將中斷變量置為false)。
線程中斷
一個線程可以通過調用Thread.interrupt()方法來中斷另外一個線程,具體過程如下:
1. 中斷變量被設置為true。
2. 如果線程執行到了阻塞方法,那么該方法取消阻塞,并將中斷變量重新置為false。
(這種機制是通過阻塞方法內部不斷輪詢中斷變量的值來實現的)
例子:
1 class ThreadTest implements Runnable {
2
3 @Override
4 public void run() {
5 System.out.println("before sleep");
6 try {
7 Thread.sleep(5000);
8 } catch (InterruptedException e) {
9 System.out.println(Thread.currentThread().getName());
10 Thread.currentThread().interrupt();
11 System.out.println("after interrupt");
12 }
13 System.out.println("after sleep");
14
15 try {
16 Thread.sleep(5000);
17 } catch (InterruptedException e) {
18 // TODO Auto-generated catch block
19 //e.printStackTrace();
20 System.out.println(Thread.currentThread().getName());
21 Thread.currentThread().interrupt();
22 System.out.println("after interrupt");
23 }
24 System.out.println("after sleep");
25 }
26
27 }
28
29 public class ThreadBasic {
30
31 public static void main(String[] args) {
32
33 Thread t = new Thread(new ThreadTest(), "thread-1");
34 t.start();
35
36 t.interrupt();
37 System.out.println(t.isInterrupted());
38 }
39 }