Udemy Course Multithreading, Concurrency & Performance 5

Thread Termination,interrupt,Daemon threads

ZONGRU Li
Jun 21, 2021

Thread Termination:什麼狀況下需要停止thread?

Thread會消耗resources例如:

  1. 記憶體與kernel resource
  2. CPU cycles 與cache memory

當thread任務完成,但是應用程式尚未結束,會希望這個thread釋放resources

或當某個thread失控時能夠,我們能夠將其停止

一般情況就算僅剩一個thread仍然運作中,則應用程式將無法停止

由以上情況將會需要可以中途停止thread

Thread.interrupt();

假設有建立兩個thread一個較threadA,另一個較threadB

在threadA中可以執行threadB.interrupt();

在什麼情況下會需要執行中interrupt呢?

  1. 在thread執行的Method中拋出InterruptedException
  2. 被要求執行的thread中明確地於程式描述怎麼執行interrupt();

如下示例:

立即執行後,雖然程式尚未中斷,但是main thread早已結束

已經看不到叫main的Thread

之後再main內加入將另外建立的thread執行interrupt();

在次執行看到直接結束如下:

另建的thread被main thread送入要執行interrupt();而中止

另一個重要的示範是interrupt()也停不下來:

寫一個次方的Method並驗證如下

花費一點點時間即計算出2的10次方

接著將數字調大

這時候在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也不復存在)

參考課程

--

--

ZONGRU Li
ZONGRU Li

Written by ZONGRU Li

2022/11/17 開源部分個人筆記給LINE "Java程式語言討論區"社群,希望能對社群的技術學習做一點點貢獻.(掩面....記得退訂閱!

No responses yet