線程池設計
A. java虛擬機中線程池使用了什麼設計模式
ThreadPool(線程池)模式,線程池就屬於多線程的一種設計模式
B. 什麼是線程池,如何設計一個動態大小的線程
只要您遵循幾條簡單的准則,線程池可以成為構建伺服器應用程序的極其有效的方法:
不要對那些同步等待其它任務結果的任務排隊。這可能會導致上面所描述的那種形式的死鎖,在那種死鎖中,所有線程都被一些任務所佔用,這些任務依次等待排隊任務的結果,而這些任務又無法執行,因為所有的線程都很忙。
在為時間可能很長的操作使用合用的線程時要小心。如果程序必須等待諸如 I/O 完成這樣的某個資源,那麼請指定最長的等待時間,以及隨後是失效還是將任務重新排隊以便稍後執行。這樣做保證了:通過將某個線程釋放給某個可能成功完成的任務,從而將最終取得某些進展。
理解任務
要有效地調整線程池大小,您需要理解正在排隊的任務以及它們正在做什麼。它們是 CPU 限制的(CPU-bound)嗎?它們是 I/O 限制的(I/O-bound)嗎?您的答案將影響您如何調整應用程序。如果您有不同的任務類,這些類有著截然不同的特徵,那麼為不同任務類設置多個工作隊列可能會有意義,這樣可以相應地調整每個池。
調整池的大小
調整線程池的大小基本上就是避免兩類錯誤:線程太少或線程太多。幸運的是,對於大多數應用程序來說,太多和太少之間的餘地相當寬。
請回憶:在應用程序中使用線程有兩個主要優點,盡管在等待諸如 I/O 的慢操作,但允許繼續進行處理,並且可以利用多處理器。在運行於具有 N 個處理器機器上的計算限制的應用程序中,在線程數目接近 N 時添加額外的線程可能會改善總處理能力,而在線程數目超過 N 時添加額外的線程將不起作用。事實上,太多的線程甚至會降低性能,因為它會導致額外的環境切換開銷。
線程池的最佳大小取決於可用處理器的數目以及工作隊列中的任務的性質。若在一個具有 N 個處理器的系統上只有一個工作隊列,其中全部是計算性質的任務,在線程池具有 N 或 N+1 個線程時一般會獲得最大的 CPU 利用率。
對於那些可能需要等待 I/O 完成的任務(例如,從套接字讀取 HTTP 請求的任務),需要讓池的大小超過可用處理器的數目,因為並不是所有線程都一直在工作。通過使用概要分析,您可以估計某個典型請求的等待時間(WT)與服務時間(ST)之間的比例。如果我們將這一比例稱之為 WT/ST,那麼對於一個具有 N 個處理器的系統,需要設置大約 N*(1+WT/ST) 個線程來保持處理器得到充分利用。
處理器利用率不是調整線程池大小過程中的唯一考慮事項。隨著線程池的增長,您可能會碰到調度程序、可用內存方面的限制,或者其它系統資源方面的限制,例如套接字、打開的文件句柄或資料庫連接等的數目。
C. java中線程池中的job類怎麼設計
看一看quartz的源碼就會了
D. Android的App中線程池的使用,具體使用多少個線程池
你這個問題有些籠統,一個完整的app有簡單有復雜,不同的app應用功能的差異也導致不同的技術實現或者演算法模型。大體來說,一個app從設計到最終實現需要你懂得以下幾個必要方面: 1、前期需求規劃與信息、交互設計——你需要制定出一個完整的需求文檔,功能文檔,流程圖,時序圖。 2、交互設計、UI設計——設計出基本且完善的原型圖和app基礎的交互設計效果,之後再根據這些設計出完整的UI界面並學會切圖,一些需要做自適應的素材圖片需要做點9patch。 這里還需要你懂得px,pt和dp之間的換算,屏幕密度的換算和相互之間的系數,以便你的app能完美適應不同解析度設備。其中交互設計需要你懂得很多人機操作的技巧經驗,掌握Axure等交互工具的使用,UI設計需要你掌握Photoshop和Illustrator等操作。 3、使用ADT之類的開發環境進行app開發,你最基本的也得掌握java語言,熟悉android環境和機制,這裡面涉及面廣,請根據項目自行學習相關知識。 4、如果不是單機版的app,需要用到伺服器,那你還得掌握WebService相關知識和開發語言,常用的有ASP.Net,PHP,JSP等。 5、熟悉並能開發資料庫。 6、某些功能需要做演算法,這還需要一定得專業知識,尤其是數學基礎。 7、熟悉API介面開發,這里包括你自行開發API的能力以及調用第三方API的經驗。 8、熟悉TCP/IP,socket等網路協議和相關知識。 9、熟練掌握App發布的流程,真機調試技巧,證書,打包,上架。 App開發其實不一定適合一個人搞,太費勁,除非是一個單機版的小應用,或者利用現成的api開發簡單的第三方應用,否則還是讓一個團隊來完成各自擅長的領域。
E. 線程池的概念及Linux 怎麼設計一個簡單的線程池
從系統中獲取線程及線程的初始化是需要耗費時間的。在初始化階段預先分配一定數量的線程,使用時從中取,使用完成放回。這就是線程池的概念。至於設計及實現線程池,網上有很多實例。
F. java線程池使用了什麼設計模式
1、代理模式
代理模式(Proxy Pattern)是對象的結構型模式,代理模式給某一個內對象提供了一個代理對象,並由代理對象控制容對原對象的引用。
代理模式不會改變原來的介面和行為,只是轉由代理干某件事,代理可以控制原來的目標,例如:代理商,代理商只會賣東西,但並不會改變行為,不會製造東西。
2、Thread-Per-Message
Pattern,是一種對於每個命令或請求,都分配一個線程,由這個線程執行工作。它將「委託消息的一端」和「執行消息的一端」用兩個不同的線程來實現。該線程模式主要包括三個部分:
1,Request參與者(委託人),也就是消息發送端或者命令請求端
2,Host參與者,接受消息的請求,負責為每個消息分配一個工作線程。
3,Worker參與者,具體執行Request參與者的任務的線程,由Host參與者來啟動。
小U給大家總結了Java相關模式,歡迎大家前來補充!
G. 2020-03-24:線程池的設計里體現了什麼設計模式
、代理模式
代理模式(Proxy Pattern)是對象的結構型模式,代理模式給某一個對象提供了一個代理對象,並由代理對象控制對原對象的引用。
代理模式不會改變原來的介面和行為,只是轉由代理干某件事,代理可以控制原來的目標,例如:代理商,代理商只會賣東西,但並不會改變行為,不會製造東西。
2、Thread-Per-Message
Pattern,是一種對於每個命令或請求,都分配一個線程,由這個線程執行工作。它將「委託消息的一端」和「執行消息的一端」用兩個不同的線程來實現。該線程模式主要包括三個部分:
1,Request參與者(委託人),也就是消息發送端或者命令請求端
2,Host參與者,接受消息的請求,負責為每個消息分配一個工作線程。
3,Worker參與者,具體執行Request參與者的任務的線程,由Host參與者來啟動。
H. android 是自己設計線程池 怎麼用
使用線程池最大的優點是我們可以對我們開啟的線程進行跟進,當我們不內需要處理的時候可以將它容shutdow掉,同時當我們定義了一個線程池之後,可以復用線程而不需要開啟更多線程,這點對於我們手機開發是至關重要的,你開啟的thread越多意味著你的app內存消耗越多,速度也就越來越慢,提高現有線程的復用是一個很棒的選擇
線程池中處理線程的類別較多如:
限制按順序來執行任務的線程池、一個一個任務的執行線程池、按指定個數來執行任務的線程池、創建一個可在指定時間里執行任務的線程池,亦可重復執行、按指定工廠模式來執行的線程池
I. 寫出java多線程程序設計中常用類及方法名,並分別說明它們的作用。
Thread類
System.Threading.Thread類是創建並控制線程,設置其優先順序並獲取其狀態最為常用的類
Mutex類
當兩個或更多線程需要同訪問一個共享資源時,系統需要使用同步機制來確保一次只有一個線程使用該資源。Mutex是同步基元,它只向一個線程授予對共享資源的獨占訪問權。
ReaderWriterLock類
ReaderWriterLock類定義支持單個寫線程和多個讀線程鎖,用於同步對資源的訪問。在任一特定時刻,它允許多個線程同時進行讀訪問,或者允許單個線程進行寫訪問。在資源不經常發生更改情況下,ReaderWriterLock類所提供的吞吐量比簡單的一次只允許一個線程的鎖更高。
ThreadPool類
如果有多個任務需要完成,每個任務需要一個線程,這時應該考慮使用線程池來更有效地管理計算機資源並且從中受益。線程池是執行的多個線程集合,它允許系統添加以線程自動創建和開始的任務到隊列中,使用線程池使得系統可以優化線程在CPU使用時的時間碎片。但是要記住在任何特定的時間點,每一個進程一每個線程池只有一個個正在運行的線程。使用ThreadPool類可以使得由線程組成的池可以被系統管理,而使開發人員主要精力集中在工作流的邏輯,而不是線程管理上。
WaitHandle類
WaitHandle類封裝等待共享資源的獨占訪問權的操作系統特定的對象,通常用做同步對象的基類。從該類派生的類定義一個信號傳輸機制以指示獲取或釋放對共享資源的獨占訪問,但使用繼承的WaitHandle方法在等待對共享資源的訪問時阻塞。使用此類的靜態方法阻塞刈割線程,直到一個或多個同步對象接收到信息。
AutoResetEent類
AutoResetEvent類通知正在等待的線程已發生事件,無法繼承此類。AutoResetEvent類允許線程通過發信號互相通信,通常此通信涉及線程需要獨占訪問的資源。
AutoResetEvent類將始終保持終止,直到一個正在等待的線程被釋放,此時系統將自動把狀態設置為非終止狀態。如果沒有任何線程豐等待,則狀態將保持為終止狀態。
J. 線程池的概念及Linux 怎麼設計一個簡單的線程池
什麼是線程池?
簡單點說,線程池就是有一堆已經創建好了的線程,初始它們都處版於空閑等待狀態,當權有新的任務需要處理的時候,就從這個池子裡面取一個空閑等 待的線程來處理該任務,當處理完成了就再次把該線程放回池中,以供後面的任務使用。當池子里的線程全都處理忙碌狀態時,線程池中沒有可用的空閑等待線程, 此時,根據需要選擇創建一個新的線程並置入池中,或者通知任務線程池忙,稍後再試。
為什麼要用線程池?
為什麼要用線程池?
我們說,線程的創建和銷毀比之進程的創建和銷毀是輕量級的,但是當我們的任務需要大量進行大量線程的創建和銷毀操作時,這個消耗就會變成的相當大。比如, 當你設計一個壓力性能測試框架的時候,需要連續產生大量的並發操作,這個是時候,線程池就可以很好的幫上你的忙。線程池的好處就在於線程復用,一個任務處理完成後,當前線程可以直接處理下一個任務,而不是銷毀後再創建,非常適用於連續產生大量並發任務的場合。