正確關閉執行緒池

2022-10-07 12:36:11 字數 1812 閱讀 1824

使用10個固定執行緒池建立100個任務

executorservice service = executors.newfixedthreadpool(10);

for (int i = 0; i < 100; i++)

threadpoolexecutor中關閉執行緒池的方法

shutdown

可以安全地關閉乙個執行緒池,呼叫 shutdown() 方法之後執行緒池並不是立刻就被關閉,因為這時執行緒池中可能還有很多任務正在被執行,或是任務佇列中有大量正在等待被執行的任務,呼叫 shutdown() 方法後執行緒池會在執行完正在執行的任務和佇列中等待的任務後才徹底關閉。但這並不代表 shutdown() 操作是沒有任何效果的,呼叫 shutdown() 方法後如果還有新的任務被提交,執行緒池則會根據拒絕策略直接拒絕後續新提交的任務

isshutdown

可以返回 true 或者 false 來判斷執行緒池是否已經開始了關閉工作,也就是是否執行了 shutdown 或者 shutdownnow 方法。這裡需要注意,如果呼叫 isshutdown() 方法的返回的結果為 true 並不代表執行緒池此時已經徹底關閉了,這僅僅代表執行緒池開始了關閉的流程,也就是說,此時可能執行緒池中依然有執行緒在執行任務,佇列裡也可能有等待被執行的任務。

isterminated

檢測線程池是否真正「終結」了,這不僅代表執行緒池已關閉,同時代表執行緒池中的所有任務都已經都執行完畢了,因為我們剛才說過,呼叫 shutdown 方法之後,執行緒池會繼續執行裡面未完成的任務,不僅包括執行緒正在執行的任務,還包括正在任務佇列中等待的任務。比如此時已經呼叫了 shutdown 方法,但是有乙個執行緒依然在執行任務,那麼此時呼叫 isshutdown 方法返回的是 true ,而呼叫 isterminated 方法返回的便是 false ,因為執行緒池中還有任務正在在被執行,執行緒池並沒有真正「終結」。直到所有任務都執行完畢了,呼叫 isterminated() 方法才會返回 true,這表示執行緒池已關閉並且執行緒池內部是空的,所有剩餘的任務都執行完畢了。

awaittermination

主要用來判斷執行緒池狀態的。比如我們給 awaittermination 方法傳入的引數是 10 秒,那麼它就會陷入 10 秒鐘的等待,直到發生以下三種情況之一:

shutdownnow

功能最強大,它與第一種 shutdown 方法不同之處在於名字中多了乙個單詞 now,也就是表示立刻關閉的意思。在執行 shutdownnow 方法之後,首先會給所有執行緒池中的執行緒傳送 interrupt 中斷訊號,嘗試中斷這些任務的執行,然後會將任務佇列中正在等待的所有任務轉移到乙個 list 中並返回,我們可以根據返回的任務 list 來進行一些補救的操作,例如記錄在案並在後期重試。shutdownnow() 的原始碼如下所示。

public listshutdownnow()  finally  

tryterminate();

return tasks;

}

你可以看到原始碼中有一行 interruptworkers() **,這行**會讓每乙個已經啟動的執行緒都中斷,這樣執行緒就可以在執行任務期間檢測到中斷訊號並進行相應的處理,提前結束任務。這裡需要注意的是,由於 j**a 中不推薦強行停止執行緒的機制的限制,即便我們呼叫了 shutdownnow 方法,如果被中斷的執行緒對於中斷訊號不理不睬,那麼依然有可能導致任務不會停止。可見我們在開發中落地最佳實踐是很重要的,我們自己編寫的執行緒應當具有響應中斷訊號的能力,正確停止執行緒的方法在第 2 講有講過,應當利用中斷訊號來協同工作。

執行緒池 如何正確的關閉執行緒池

在呼叫這個關閉方法時,執行緒池會根據我們配置的拒絕策略來拒絕掉想要進來的執行緒,也就是說吧建立執行執行緒的入口給關閉掉了,直到執行緒池內的所有執行緒都執行完成。在呼叫這個方法完畢之後,並不代表這個執行緒池就真的都停掉了,只能說他不讓其他執行緒進來了,然後等到執行緒池內的執行緒執行完。shutdown...

你知道如何安全正確的關閉執行緒池嗎?

純潔的微笑 我們知道應用停機時需要釋放資源,關閉連線,而對於一些定時任務或者網路請求服務會使用執行緒池,當應用停機時我們需要正確安全的關閉執行緒池,如果處理不當,可能造成資料丟失,業務請求結果不正確等問題。關閉執行緒池我們可以選擇什麼都不做,jvm 關閉時自然的會清除執行緒池物件。當然這麼做,存在很...

你知道如何安全正確的關閉執行緒池嗎?

純潔的微笑 我們知道應用停機時需要釋放資源,關閉連線,而對於一些定時任務或者網路請求服務會使用執行緒池,當應用停機時我們需要正確安全的關閉執行緒池,如果處理不當,可能造成資料丟失,業務請求結果不正確等問題。關閉執行緒池我們可以選擇什麼都不做,jvm 關閉時自然的會清除執行緒池物件。當然這麼做,存在很...