Ⅰ 什麼是線程池,如何使用,為什麼要用
線程池,thread pool,是一種線程使用模式,線程池維護著多個線程,等待著監督管理者分配可並發執行的任務。
功能:應用程序可以有多個線程,這些線程在休眠狀態中需要耗費大量時間來等待事件發生。其他線程可能進入睡眠狀態,並且僅定期被喚醒以輪循更改或更新狀態信息,然後再次進入休眠狀態。
為了簡化對這些線程的管理,.NET框架為每個進程提供了一個線程池,一個線程池有若干個等待操作狀態,當一個等待操作完成時,線程池中的輔助線程會執行回調函數。線程池中的線程由系統管理,程序員不需要費力於線程管理,可以集中精力處理應用程序任務。
(1)線程池回收擴展閱讀:
應用范圍
1、需要大量的線程來完成任務,且完成任務的時間比較短。 WEB伺服器完成網頁請求這樣的任務,使用線程池技術是非常合適的。因為單個任務小,而任務數量巨大,你可以想像一個熱門網站的點擊次數。 但對於長時間的任務,比如一個Telnet連接請求,線程池的優點就不明顯了。因為Telnet會話時間比線程的創建時間大多了。
2、對性能要求苛刻的應用,比如要求伺服器迅速響應客戶請求。
3、接受突發性的大量請求,但不至於使伺服器因此產生大量線程的應用。突發性大量客戶請求,在沒有線程池情況下,將產生大量線程,雖然理論上大部分操作系統線程數目最大值不是問題,短時間內產生大量線程可能使內存到達極限,並出現"OutOfMemory"的錯誤。
Ⅱ 請教java的線程池是如何回收線程的
是一開始分配自定義個線程。方法結束還是由垃圾回收機制回收。
Ⅲ java線程池哪個方法用來回收空閑的線程
那就是線程池的實現的事情了,你不用管,你也管不了,你只管用就好
Ⅳ 線程池回收線程會清理threadlocal嗎
會自動處理垃圾回收的,不過回收周期比較長,你才有這種耽心,其實不必去理會它
Ⅳ ExecutorService線程池中怎麼去暫停和繼續一個線程
run() 方法執行完,線程就停止了。等待該線程對象被回收就可以了。如果你是要重復執行 run() 方法中的代碼,可以在裡面加一個 while(布爾變數) 這樣的循環,其中的布爾變數使用類的私有變數,由其它事件觸發,將其改變為 false ,這樣在退出循環之前,循環體會完全執行,不會出現使用 stop() 方法時可能出現的問題,run() 方法就能圓滿結束了。
Ⅵ java中ExecutorService的線程池如何暫停所有的任務和繼續所有的任務 有這樣的函數嗎
Executor 提供了管理終止的方法,以及可為跟蹤一個或多個非同步任務執行狀況而生成 Future 的方法。
可以關閉 ExecutorService,這將導致其拒絕新任務。提供兩個方法來關閉 ExecutorService。shutdown() 方法在終止前允許執行以前提交的任務,而 shutdownNow() 方法阻止等待任務啟動並試圖停止當前正在執行的任務。在終止時,執行程序沒有任務在執行,也沒有任務在等待執行,並且無法提交新任務。應該關閉未使用的 ExecutorService 以允許回收其資源。
通過創建並返回一個可用於取消執行和/或等待完成的 Future,方法 submit 擴展了基本方法 Executor.execute(java.lang.Runnable)。方法 invokeAny 和 invokeAll 是批量執行的最常用形式,它們執行任務 collection,然後等待至少一個,或全部任務完成(可使用 ExecutorCompletionService 類來編寫這些方法的自定義變體)。
Executors 類提供了用於此包中所提供的執行程序服務的工廠方法。
Ⅶ 請教java的線程池是如何回收線程的
工作線程回收需要滿足三個條件:
1) 參數allowCoreThreadTimeOut為true
2) 該線程在keepAliveTime時間內獲取不到任務,即空閑這么長時間
3) 當前線程池大小 > 核心線程池大小corePoolSize。
Ⅷ java線程池ExecutorService,裡面有多少空餘線程,怎麼看
另外創建一個全局單例的對象,用來保存每個線程的獲取狀態<Long threadId,Boolean using> map。再從線程池裡獲取或者回收時,去更新這個map。當然這樣代碼侵入性太高。真的要透明的話,只能自己仿照線程池的實現去重寫了。
Ⅸ 為什麼要在建立線程池的時候線程和主線程分離
-
=
不分開還叫什麼多線程
難道你自己不停地輪訓工作函數一次一次地執行?
線程池的主線程只是用來預先批量初始化、分配、回收的
工作線程是自治的完成具體的工作任務
而且如果不分開的話工作線程拋出異常會造成整個池的崩潰