1. 程式人生 > 其它 >多執行緒設計模式之兩階段終止模式

多執行緒設計模式之兩階段終止模式

 

 

Thread類中interrupt()、interrupted()和isInterrupted()

interrupt()是用來設定中斷狀態的。返回true說明中斷狀態被設定了而不是被清除了。我們呼叫sleep、wait等此類可中斷(throw InterruptedException)方法時,一旦方法丟擲InterruptedException,當前呼叫該方法的執行緒的中斷狀態就會被jvm自動清除了,就是說我們呼叫該執行緒的isInterrupted 方法時是返回false。如果你想保持中斷狀態,可以再次呼叫interrupt方法設定中斷狀態。這樣做的原因是,java的中斷並不是真正的中斷執行緒,而只設置標誌位(中斷位)來通知使用者。如果你捕獲到中斷異常,說明當前執行緒已經被中斷,不需要繼續保持中斷位。
interrupted是靜態方法,返回的是當前執行緒的中斷狀態。例如,如果當前執行緒被中斷(沒有丟擲中斷異常,否則中斷狀態就會被清除),你呼叫interrupted方法,第一次會返回true。然後,當前執行緒的中斷狀態被方法內部清除了。第二次呼叫時就會返回false。如果你剛開始一直呼叫isInterrupted,則會一直返回true,除非中間執行緒的中斷狀態被其他操作清除了。

 

如何確保在執行和等待都能正常快速優雅的打斷程式?

public class Test7 {
	public static void main(String[] args) throws InterruptedException {
		Monitor monitor = new Monitor();
		monitor.start();
		Thread.sleep(3500);
		monitor.stop();
	}
}

class Monitor {

	Thread monitor;

	/**
	 * 啟動監控器執行緒
	 */
	public void start() {
		//設定線控器執行緒,用於監控執行緒狀態
		monitor = new Thread() {
			@Override
			public void run() {
				//開始不停的監控
				while (true) {
                    //判斷當前執行緒是否被打斷了
					if(Thread.currentThread().isInterrupted()) {
						System.out.println("處理後續任務");
                        //終止執行緒執行
						break;
					}
					System.out.println("監控器執行中...");
					try {
						//執行緒休眠
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						e.printStackTrace();
						//如果是在休眠的時候被打斷,不會將打斷標記設定為true,這時要重新設定打斷標記
						Thread.currentThread().interrupt();
					}
				}
			}
		};
		monitor.start();
	}

	/**
	 * 	用於停止監控器執行緒
	 */
	public void stop() {
		//打斷執行緒
		monitor.interrupt();
	}
}