併發的異常

中斷一個線程Thread.interrupt()時會觸發下面一種情況:

如果線程在調用 Object 類的 wait()、wait(long) 或 wait(long, int) 方法,或者該類的 join()、join(long)、join(long, int)、sleep(long) 或 sleep(long, int) 方法過程中受阻,則其中斷狀態將被清除,它還將收到一個 InterruptedException。

如果連續兩次調用該方法,則第二次調用將返回 false
也就是說如果檢測到一個線程已經被中斷了,那麼線程的使用方(掛起、等待或者正在執行)都將應該得到一箇中斷異常,同時將會清除異常中斷狀態。
因爲我們的線程在線程池中是被重複執行的,所以一旦線程被中斷後並不會退出線程,而是設置中斷位,等候任務隊列自己處理線程,從而達到線程被重複利用的目的。

除了InterruptedException 異常我們還發現了一個全新的異常java.util.concurrent.TimeoutException,此異常是用來描述任務執行時間超過了期望等待時間,也許是一直沒有獲取到鎖,也許是還沒有執行完成。

比如如果執行一個非常耗時的網絡任務,我們不希望任務一直等待從而佔用大量的資源,可能在一定時間後就會希望取消此操作。此時超時異常很好的描述了這種需求。

與此同時,如果取消了一個任務,那麼再次從任務中獲取執行結果,那麼將會得到一個任務被取消的異常java.util.concurrent.CancellationException。

除了上述異常外,還將得到一個java.util.concurrent.ExecutionException異常,

這是因爲我們的提交的任務java.util.concurrent.Callable在call()方法中允許拋出任何異常,另外常規的線程執行也可能拋出一個RuntimeException,所以這裏簡單包裝了下所有異常,當作執行過程中發生的異常ExecutionException拋出。

避免死鎖的方法就是
死鎖思路

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章