05 Thread類API詳解 優雅的關閉執行緒

2021-10-24 09:18:15 字數 2406 閱讀 8266

方式2 通過執行緒打斷的方式

3 強制中斷

因為它本質上是不安全的。停止執行緒會導致它解鎖所有已鎖定的監視器。(當threaddeath異常在堆疊中傳播時,監視器被解鎖。)如果之前由這些監視器保護的物件中的任何乙個處於不一致狀態,則其他執行緒現在可以以不一致的狀態檢視這些物件。據稱這些物體被 損壞。當執行緒操作受損物件時,可能導致任意行為。這種行為可能微妙且難以檢測,或者可能會發音。與其他未經檢查的異常不同,可以 threaddeath靜默地殺死執行緒; 因此,使用者沒有警告他的程式可能被損壞。腐敗現象可能會在實際損害發生後隨時出現,甚至可能在未來數小時甚至數天。

demo

定義執行緒

@slf4j

public class threadtask implements runnable is runniung...", thread.currentthread().getname());

} catch (interruptedexception e) }}

public void shutdown()

}

測試

public

static

void

main

(string[

] args)

throws interruptedexception

public

class

stopthreaddemo2

@slf4j

static

class

mythread

extends

thread

log.

info

("{} is runniung..."

, thread.

currentthread()

.getname()

);}}

}}

上面的方式,有個問題,如果執行緒執行過程中沒有機會去判斷執行緒的是否被打斷呢?

比如說,這個執行緒內部去通訊讀取資料,或者讀取檔案,我期望就是在30分鐘內結束資料的讀取或者檔案的讀取,30分鐘後,打斷這個讀取資料的執行緒,可是就是在這個讀取資料的過程中阻塞住了,就走不到你判斷是否打斷的**呢?也沒機會去判斷定義的開關?

思路

守護執行緒,設定子執行緒為守護執行緒,當父執行緒結束的時候,子執行緒也會停止,就可以利用守護執行緒的這個特點實現。

這裡將父執行緒對外是執行執行緒,內部其實真正的執行是交給子執行緒去做的

這裡就可以做一下簡單的封裝

@slf4j

public

class

threadservice

catch

(interruptedexception e)}}

; excutethread.

start()

;}/** * 顯式的殺死excutethread這個執行執行緒

* @param mills 任務的超時時間,任務最大執行時間

*/public

void

shutdown

(long mills)

// 任務沒有結束,也沒有超時,簡單休眠一下

trycatch

(interruptedexception e)}}

}

測試

@slf4j

public

class

test

catch (interruptedexception e)

}});

// 我們期望在10s內結束,也就是超時時間為10s

threadservice.shutdown(10_000);

long end = system.currenttimemillis();

}*/// 測試任務執行沒有超時

public

static

void

main

(string[

] args)

catch

(interruptedexception e)})

;// 我們期望在10s內結束,也就是超時時間為10s

threadservice.

shutdown

(10_000)

; long end = system.

currenttimemillis()

; system.out.

println(+

(end - start));

}}

Thread執行緒類

posted on 2011 05 03 10 45 明天陪你看海 閱讀 123 編輯收藏 說明 apartmentstate 獲取或設定此執行緒的單元狀態 currentcontext 獲取執行緒正在其中執行的當前上下文 currentthread 獲取當前正在執行的執行緒 isalive 獲取乙...

Thread執行緒類

posted on 2011 05 03 10 45 明天陪你看海 閱讀 123 編輯收藏 說明 apartmentstate 獲取或設定此執行緒的單元狀態 currentcontext 獲取執行緒正在其中執行的當前上下文 currentthread 獲取當前正在執行的執行緒 isalive 獲取乙...

Thread執行緒類

屬性說明 apartmentstate 獲取或設定此執行緒的單元狀態 currentcontext 獲取執行緒正在其中執行的當前上下文 currentthread 獲取當前正在執行的執行緒 isalive 獲取乙個值,該值指示當前執行緒的執行狀態 managedthreadid 獲取當前託管執行緒的...