線程池? 如何設計一個動態大小的線程池,有哪些方法?


【線程池?  如何設計一個動態大小的線程池,有哪些方法?】

線程池:顧名思義就是事先創建若干個可執行的線程放入一個池(容器) 需要的時候從池中獲取線程不用自行創建使用完畢不需要銷毀線程而是放回池中 從而減少創建和銷毀線程對象的開銷

系統啟動一個新線程的成本是比較高的,因為它涉及與操作系統的交互。此時,使用線程池可以很好地提高性能,尤其是當程序中需要創建大量生存期很短暫的線程時,更應該考慮使用線程池。

與數據庫連接池相似,線程池在系統啟動時即創建大量空閑的線程,程序將一個Runnable對象或Callable對象傳給線程池,線程池就會啟動一個線程來執行它們的run()call()方法,當run()call()方法執行結束后,該線程並不會死亡,而是再次返回線程池中成為空閑狀態,等待執行下一個Runnable對象的run()call()方法。

使用線程池可以有效地控制系統中並發線程的數量,當系統中包含大量並發線程時,會導致系統劇烈下降,甚至JVM崩潰,而線程池的最大線程數參數可以控制系統中並發線程數不超過此數。

 

 

 

設計一個動態大小的線程池,如何設計,應該有哪些方法?

一個線程池包括四個基本部分:

1 線程管理器(ThreadPool):用於創建並管理線程池,包括創建線程、銷毀線程池、添加新任務。

2 工作線程(PoolWorker):線程池中線程,在沒有任務時處於等待狀態,可以循環的執行任務。

3 任務接口(Task):每個任務必須實現的接口,以供工作線程調度任務的執行,它主要規定了任務的入口、任務執行 完后的收尾工作、任務的執行狀態等。

4 任務隊列(TaskQueue):用於存放沒有處理的任務,提供一種緩沖機制。

 

 

所包含方法:

private ThreadPool()  創建線程池

public static ThreadPool getThreadPool()  獲得一個默認線程個數的線程池

public void ececute(Runnable task) 執行任務,其實只是把任務加入任務隊列,什么時候執行由線程池管理器決定

public void execute(Runnable[] task)批量執行任務,其實只是把任務加入任務隊列,什么時候執行由線程池管理器決定

public void destroy() 銷毀線程池,該方法保證在所有任務都完成的情況下才銷毀所有線程,否則等待任務完成才銷毀

public int getWork ThreadNumber() 返回工作線程的個數

public int getFinishedTasknumber() 返回已完成任務的個數,這里的已完成是指出了任務隊列的任務個數,可能改任務 並沒有實際執行完成

public void addThread() 在保證線程池中所有線程正在執行,並且要執行線程的個數大於某一值時,增加線程池中的 線程個數

public void reduceThread()在保證線程池中有很大一部分線程處於空閑狀態,並且空閑狀態的線程在小於某一個值時, 減少線程池中線程的個數

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM