1. 程式人生 > >多執行緒學習-day-02理解中斷

多執行緒學習-day-02理解中斷

執行緒基礎、執行緒之間的共享和協作

(目前會將一些概念簡單描述,一些重點的點會詳細描述)

上一章回顧:

基礎概念:

1,CPU核心數,執行緒數

2,CPU時間片輪轉機制

3,什麼是程序和執行緒

4,什麼是並行和併發

5,高併發的意義、好處和注意事項

執行緒基礎:

1,啟動和終止執行緒

        ①、三種啟動執行緒方式

 

本章學習目標:

理解中斷

如何安全的終止執行緒

 

1,理解中斷

        執行緒自然終止:自然執行完 或 丟擲未處理異常

        stop()、resume()、suspend() 三個方法已經在後續的jdk版本已過時,不建議使用

        stop()方法:會導致執行緒不正確釋放資源;

        suspend()方法:掛起,容易導致死鎖

        Java執行緒是協作式工作,而非搶佔式工作;

        介紹三種中斷方式:

        ①、interrupt()方法

                interrupt()方法中斷一個執行緒,並不是強制關閉該執行緒,只是跟該執行緒打個招呼,將執行緒的中斷標誌位置為true,執行緒是否中斷,由執行緒本身決定;

        ②、inInterrupted()方法

                inInterrupted()方法判斷當前執行緒是否處於中斷狀態;

        ③、static 方法interrupted()方法

                static方法interrupted()方法判斷當前執行緒是否處於中斷狀態,並將中斷標誌位改為false;

        注:方法裡如果丟擲InterruptedException,執行緒的中斷標誌位會被置為false,如果確實需要中斷執行緒,則需要在catch裡面再次呼叫interrupt()方法

public class HasInterruptException {

	// 定義一個私有的Thread整合類
	private static class UseThread extends Thread {

		@Override
		public void run() {
			// 獲取當前執行緒名字
			String threadName = Thread.currentThread().getName();
			// 判斷執行緒是否處於中斷標誌位
			while (!isInterrupted()) {
				// 測試用interrupt中斷後,報InterruptedException時狀態變化
				try {
					System.out.println(threadName + "is run !!!!");
					// 設定休眠毫秒數
					Thread.sleep(3000);
				} catch (InterruptedException e) {
					// 判斷中斷後丟擲InterruptedException後中斷標誌位的狀態
					System.out.println(threadName + " interrupt flag is " + isInterrupted());
					// 如果丟擲InterruptedException後中斷標誌位置為了false,則需要手動再呼叫interrupt()方法,如果不呼叫,則中斷標誌位為false,則會一直在死迴圈中而不會退出
					interrupt();
					e.printStackTrace();
				}
				// 打印出執行緒名稱
				System.out.println(threadName);
			}
			// 檢視當前執行緒中斷標誌位的狀態
			System.out.println(threadName + " interrupt flag is " + isInterrupted());
		}
	}

	public static void main(String[] args) throws InterruptedException {
		UseThread useThread = new UseThread();
		useThread.setName("HasInterruptException--");
		useThread.start();
		Thread.sleep(800);
		useThread.interrupt();
	}
}

控制檯輸出結果:
HasInterruptException--is run !!!!
HasInterruptException-- interrupt flag is false
java.lang.InterruptedException: sleep interrupted
HasInterruptException--
HasInterruptException-- interrupt flag is true
	at java.lang.Thread.sleep(Native Method)
	at com.xiangxue.ch1.safeend.HasInterruptException$UseThread.run(HasInterruptException.java:18)

來自享學IT教育課後總結。