Java執行緒池實現原理與技術I

2021-09-01 11:59:32 字數 1913 閱讀 8364

多執行緒的軟體設計方法確實可以最大限度地發揮多核處理器的計算能力,提高生產系統的吞吐量和效能。但是,若不加控制和管理的隨意使用執行緒,對系統的效能反而會產生不利的影響。

一種最為簡單的執行緒建立和**的方法類似如下:

new thread(new runnable() 

}).start();

以上**建立了一條執行緒,並在run()方法結束後,自動**該執行緒。在簡單的應用系統中,這段**並沒有太多問題。但是在真實的生產環境中,系統由於真實環境的需要,可能會開啟很多執行緒來支撐其應用。而當執行緒數量過大時,反而會耗盡cpu和記憶體資源。

首先,雖然與程序相比,執行緒是一種輕量級的工具,但其建立和關閉依然需要花費時間,如果為每乙個小的任務都建立乙個執行緒,很有可能出現建立和銷毀執行緒所占用的時間大於該線**實工作所消耗的時間,反而會得不償失。

其次,執行緒本身也是要占用記憶體空間的,大量的執行緒會搶占寶貴的內部資源。

因此,在實際生產環境中,執行緒的數量必須得到控制。盲目地大量建立執行緒對系統效能是有傷害的。

下面給出乙個最簡單的執行緒池,該執行緒池不是乙個完善的執行緒池,但已經實現了乙個基本執行緒池的核心功能,有助於快速理解執行緒池的實現。

1、執行緒池的實現

public class threadpool 

public int getcreatedthreadcounter() 

//取得執行緒池的例項

public synchronized static threadpool getinstance() 

return instance;

}//將執行緒池放入池中

protected synchronized void repool(pthread repoolingthread)  else 

}//停止池中所有執行緒

public synchronized void shutdown() 

}//執行任務

public synchronized void start(runnable target) //沒有空閒執行緒,則建立執行緒

else }}

2、要實現上面的執行緒池,就需要乙個永不退出的執行緒與之配合。pthread就是乙個這樣的執行緒。它的主體部分是乙個無限迴圈,該執行緒在手動關閉前永不結束,並一直等待新的任務到達。

public class pthread extends thread 

public runnable gettarget()

public boolean isidle() 

@override

public void run() 

try 

} catch (interruptedexception e) 

isidle = false;}}

public synchronized void settarget(runnable newtarget)

//關閉執行緒

public synchronized void shutdown()

}

3、測試main方法

public static void main(string args) throws interruptedexception  catch (interruptedexception e) 

}});}}

執行緒池如此常用,以致於jdk自帶了一些執行緒池框架,例如 threadpoolexecutor,以及基於threadpoolexecutor實現的executor框架 。關於執行緒池框架的介紹,限於篇幅,等待下回分解。

關注後端技術精選,每天推送優質好文

Java執行緒池實現原理與技術I

多執行緒的軟體設計方法確實可以最大限度地發揮多核處理器的計算能力,提高生產系統的吞吐量和效能。但是,若不加控制和管理的隨意使用執行緒,對系統的效能反而會產生不利的影響。一種最為簡單的執行緒建立和 的方法類似如下 new thread new runnable start 以上 建立了一條執行緒,並在...

Java執行緒池實現原理

threadpoolexecutor是jdk提供的執行緒池實現,threadpoolexector實現了execturo介面,可以自動幫助使用者建立,銷毀和保護執行緒,先來看一下最基本的使用方式 建立乙個執行緒池final executor executor new threadpoolexecut...

執行緒池實現原理

上面這幅圖作者表達的不夠完整,作者想通過如下文本來表達內含本質。過程如下 如果請求執行緒小於執行緒池目標執行緒,則執行緒池會新建立執行緒來處理請求 如果請求執行緒數過多,超過了目標執行緒則將請求任務放入佇列中進行緩衝 如果佇列滿了 但未達到最大執行緒池數,這時會新建立執行緒 直到上限為止即maxpo...