Udemy Course Multithreading, Concurrency & Performance 5
Thread Termination:什麼狀況下需要停止thread?
Thread會消耗resources例如:
- 記憶體與kernel resource
- CPU cycles 與cache memory
當thread任務完成,但是應用程式尚未結束,會希望這個thread釋放resources
或當某個thread失控時能夠,我們能夠將其停止
一般情況就算僅剩一個thread仍然運作中,則應用程式將無法停止
由以上情況將會需要可以中途停止thread
Thread.interrupt();
假設有建立兩個thread一個較threadA,另一個較threadB
在threadA中可以執行threadB.interrupt();
在什麼情況下會需要執行中interrupt呢?
- 在thread執行的Method中拋出InterruptedException
- 被要求執行的thread中明確地於程式描述怎麼執行interrupt();
如下示例:
立即執行後,雖然程式尚未中斷,但是main thread早已結束
之後再main內加入將另外建立的thread執行interrupt();
在次執行看到直接結束如下:
另建的thread被main thread送入要執行interrupt();而中止
另一個重要的示範是interrupt()也停不下來:
寫一個次方的Method並驗證如下
接著將數字調大
這時候在main thread加入interrupt()嘗試中止運算:
再次執行:
這是因為電腦仍卡在計算中,沒有理會到main thread送來的thread.interrupt()
所以解法應該從計算中著手如下:
再一次執行看到:
Daemon Threads:
其作用是當main thread中止時
其他額外建立的threads不會阻止整個應用程式結束
例如一些常見的文字編輯器會起一個背景thread在每分鐘幫你儲存一次草稿
當你直接關掉整個文字編輯器時,根本不care這個背景thread
甚至你根本不想等待這個背景thread結束
範例將thread.setDaemon為true:
如上另建的thread計算次方的程式移除了檢查是否被送interrupt()
但是整個應用程式仍直接結束,沒有卡在持續計算
因為整個應用程式隨著main thread結束而整個關閉
(i.e.另建的thread也不復存在)