導航:首頁 > 源碼編譯 > 線程池源碼

線程池源碼

發布時間:2022-02-22 21:29:49

Ⅰ 哪有linux c++ socket 線程池或者多線程 server的源碼

io本身堵塞或非堵塞,看應用的吧。

至於非同步,也是看應用情況。

java線程池中的核心線程是如何被重復利用的

Java線程池中的核心線程是如何被重復利用的?

引言

在Java開發中,經常需要創建線程去執行一些任務,實現起來也非常方便,但如果並發的線程數量很多,並且每個線程都是執行一個時間很短的任務就結束了,這樣頻繁創建線程就會大大降低系統的效率,因為頻繁創建線程和銷毀線程需要時間。此時,我們很自然會想到使用線程池來解決這個問題。

使用線程池的好處:

Ⅲ 線程池如何保證核心線程不被銷毀

Java線程池中的核心線程是如何被重復利用的?

引言

在Java開發中,經常需要創建線程去執行一些任務,實現起來也非常方便,但如果並發的線程數量很多,並且每個線程都是執行一個時間很短的任務就結束了,這樣頻繁創建線程就會大大降低系統的效率,因為頻繁創建線程和銷毀線程需要時間。此時,我們很自然會想到使用線程池來解決這個問題。

使用線程池的好處:

Ⅳ 什麼是java線程池

多線程是為了能夠讓計算機資源合理的分配,對於處理不同的任務創建不同的線程進行處理,但是計算機創建一個線程或者銷毀一個線程所花費的也是比較昂貴的,有時候需要同時處理的事情比較多,就需要我們頻繁的進行線程的創建和銷毀,這樣花費的時間也是比較多的。為了解決這一問題,我們就可以引用線程池的概念。
所謂線程池就是將線程集中管理起來,當需要線程的時候,可以從線程池中獲取空閑的線程,這樣可以減少線程的頻繁創建與銷毀,節省很大的時間和減少很多不必要的操作。
在java中提供了ThreadPoolExecutor類來進行線程的管理,這個類繼承於AbstractExecutorService,而AbstractExecutorService實現了ExecutorService介面,我們可以使用ThreadPoolExecutor來進行線程池的創建。
在ThreadPoolExecutor的構造方法中,有多個參數,可以配置不同的參數來進行優化。這個類的源碼構造方法為:
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)其中每個參數代表的意義分別為
corePoolSize : 線程池中的核心線程數量,當線程池中當前的線程數小於這個配置的時候,如果有一個新的任務到來,即使線程池中還存在空閑狀態的線程,程序也會繼續創建一個新的線程放進線程池當中
maximumPoolSize: 線程池中的線程最大數量
keepAliveTime:當線程池中的線程數量大於配置的核心線程數量(corePoolSize)的時候,如果當前有空閑的線程,則當這個空閑線程可以存在的時間,如果在keepAliveTime這個時間點內沒有新的任務使用這個線程,那麼這個線程將會結束,核心線程不會結束,但是如果配置了allowCoreThreadTimeOut = true,則當空閑時間超過keepAliveTime之後,線程也會被結束調,默認allowCoreThreadTimeOut = false,即表示默認情況下,核心線程會一直存在於線程池當中。
unit : 空閑線程保持連接時間(keepAliveTime)的時間單位
workQueue:阻塞的任務隊列,用來保存等待需要執行的任務。
threadFactory :線程工廠,可以根據自己的需求去創建線程的對象,設置線程的名稱,優先順序等屬性信息。
handler:當線程池中存在的線程數超過設置的最大值之後,新的任務就會被拒絕,可以自己定義一個拒絕的策略,當新任務被拒絕之後,就會使用hander方法進行處理。
在java中也提供了Executors工具類,在這個工具類中提供了多個創建線程池的靜態方法,其中包含newCachedThreadPool、newFixedThreadPool、newScheledThreadPool、newSingleThreadExecutor等。但是他們每個方法都是創建了ThreadPoolExecutor對象,不同的是,每個對象的初始 參數值不一樣;

Ⅳ 幾種開源Java Web容器線程池的實現方法簡介

其中Resin從V3.0後需要購買才能用於商業目的,而其他兩種則是純開源的。可以分別從他們的網站上下載最新的二進制包和源代碼。
作為Web容器,需要承受較高的訪問量,能夠同時響應不同用戶的請求,能夠在惡劣環境下保持較高的穩定性和健壯性。在HTTP伺服器領域,ApacheHTTPD的效率是最高的,也是最為穩定的,但它只能處理靜態頁面的請求,如果需要支持動態頁面請求,則必須安裝相應的插件,比如mod_perl可以處理Perl腳本,mod_python可以處理Python腳本。
上面介紹的三中Web容器,都是使用Java編寫的HTTP伺服器,當然他們都可以嵌到Apache中使用,也可以獨立使用。分析它們處理客戶請求的方法有助於了解Java多線程和線程池的實現方法,為設計強大的多線程伺服器打好基礎。
Tomcat是使用最廣的Java Web容器,功能強大,可擴展性強。最新版本的Tomcat(5.5.17)為了提高響應速度和效率,使用了Apache Portable Runtime(APR)作為最底層,使用了APR中包含Socket、緩沖池等多種技術,性能也提高了。APR也是Apache HTTPD的最底層。可想而知,同屬於ASF(Apache Software Foundation)中的成員,互補互用的情況還是很多的,雖然使用了不同的開發語言。
Tomcat 的線程池位於tomcat-util.jar文件中,包含了兩種線程池方案。方案一:使用APR的Pool技術,使用了JNI;方案二:使用Java實現的ThreadPool。這里介紹的是第二種。如果想了解APR的Pool技術,可以查看APR的源代碼。
ThreadPool默認創建了5個線程,保存在一個200維的線程數組中,創建時就啟動了這些線程,當然在沒有請求時,它們都處理等待狀態(其實就是一個while循環,不停的等待notify)。如果有請求時,空閑線程會被喚醒執行用戶的請求。
具體的請求過程是:服務啟動時,創建一個一維線程數組(maxThread=200個),並創建空閑線程(minSpareThreads=5個)隨時等待用戶請求。當有用戶請求時,調用 threadpool.runIt(ThreadPoolRunnable)方法,將一個需要執行的實例傳給ThreadPool中。其中用戶需要執行的實例必須實現ThreadPoolRunnable介面。 ThreadPool首先查找空閑的線程,如果有則用它運行要執行ThreadPoolRunnable;如果沒有空閑線程並且沒有超過 maxThreads,就一次性創建minSpareThreads個空閑線程;如果已經超過了maxThreads了,就等待空閑線程了。總之,要找到空閑的線程,以便用它執行實例。找到後,將該線程從線程數組中移走。接著喚醒已經找到的空閑線程,用它運行執行實例(ThreadPoolRunnable)。運行完ThreadPoolRunnable後,就將該線程重新放到線程數組中,作為空閑線程供後續使用。
由此可以看出,Tomcat的線程池實現是比較簡單的,ThreadPool.java也只有840行代碼。用一個一維數組保存空閑的線程,每次以一個較小步伐(5個)創建空閑線程並放到線程池中。使用時從數組中移走空閑的線程,用完後,再歸還給線程池。

Ⅵ 請高手幫忙解釋下這多線程的源代碼,每句注釋下 #include <stdio.h> #include <stdlib.h>

首先這是一個生產者和消費者問題。

生產者procer負責產生數據,然後通過put操作將數據放到緩沖區buf中。

消費者consumer負責顯示數據,通過get操作從緩沖區buf中讀取數據。

========》

先看主函數main(),

生產者和消費者分別用兩個線程來實現。

主函數中的pthread_create()函數就是用來創建這兩個線程的。

開始定義了兩個變數th_a,th_b用來記錄這兩個線程的線程號。

線程的程序體分別是procer,consumer。

接下來的pthread_join用來等待兩個線程結束。因為如果不等待,main函數的主線程會立即結束,而兩個子線程還來不及完全執行。

=======》

下面來分別看procer,consumer這兩個線程。

procer循環一百次,每次調用put往buffer中放數據,最後放一個OVER;

consumer循環用get從buffer中讀到數據並列印,直到讀取的數據位OVER數據時結束。

=======》

我們再分別來看put操作和get操作。

由於put和get都要訪問buf,buf就是一個臨界資源,為了解決這個臨界資源,在使用buf之前,要對它加鎖。

pthread_mutex_lock(b->lock)一個為信號量加鎖的函數。每個信號量只能加鎖一次(我說的可能不準確),如果執行該函數的時候,參數中的信號量已經被加鎖,則該函數阻塞,直到信號量被解鎖才繼續執行。這樣就能保證信號量所保護的臨界資源能夠被互斥的訪問。

structprodcons{

intbuffer[BUFFER_SIZE];/*這個就是循環緩沖區*/

pthread_mutex_tlock;/*這個是信號量,用來保證對緩沖區的互斥訪問*/

intreadpos,writepos;/*這兩個成員分別表示讀位置和寫位置*/

pthread_cond_tnotempty;/*這是表示緩沖區「非空」的條件信號量*/

pthread_cond_tnotfull;/*這是表示緩沖區「非滿」的條件信號量*/

};

buf是一個循環的緩沖區,我們先來看緩沖區為空和滿這兩種狀態時,讀、寫標記(readpos,writepos)的位置。

緩沖區為空時,readpos和writepos指在同一位置;

換從去為滿時,writepos位置的下一個位置就是readpos。

/*put負責把數據放到緩沖區*/

voidput(structprodcons*b,intdata)

{

//首先對互斥信號量進行加鎖

pthread_mutex_lock(&b->lock);

/*這里就是判斷緩沖區有沒有滿,用writepos+1與readpos比較,可以參考附圖。

*因為是循環緩沖區,所以要模BUFFER_SIZE。

*如果緩沖區滿,將在while中等待,直到緩沖區非滿,再繼續執行。

*/

while((b->writepos+1)%BUFFER_SIZE==b->readpos){

printf("waitfornotfull ");

//如果已經滿了,則等待消費者讀取了數據後發出「非滿」信號。

pthread_cond_wait(&b->notfull,&b->lock);

}

/*當緩沖區非滿時,將數據寫入緩沖區中writepos對應的位置*/

b->buffer[b->writepos]=data;

//更新writepos到下一個位置

b->writepos++;

//循環利用緩沖區空間,如果超過了最大值,則從頭開始。

if(b->writepos>=BUFFER_SIZE)b->writepos=0;

/*向消費者發送信號,告訴消費者緩沖取非空*/

pthread_cond_signal(&b->notempty);

//對互斥信號進行解鎖。

pthread_mutex_unlock(&b->lock);

}

/*--------------------------------------------------------*/

/*get負責從緩沖區中讀取數據*/

intget(structprodcons*b)

{

intdata;

//對互斥信號量進行加鎖

pthread_mutex_lock(&b->lock);

/*判斷緩沖區是否為空,為空則等待*/

while(b->writepos==b->readpos){

printf("waitfornotempty ");

pthread_cond_wait(&b->notempty,&b->lock);

}

/*讀取readpos位置的數據*/

data=b->buffer[b->readpos];

//更新readpos到下一個位置。

b->readpos++;

//循環利用緩沖區,回撥指針

if(b->readpos>=BUFFER_SIZE)b->readpos=0;

/*發信號給生產者,緩沖區非滿,可以放數據了*/

pthread_cond_signal(&b->notfull);

//對互斥信號量進行解鎖

pthread_mutex_unlock(&b->lock);

returndata;

}

Ⅶ java哪個框架的多線程源碼值得學習

最值得學的當屬Spring框架了。不過學之前還是先熟悉它裡面的各種概念好一些。 如果想零碎點學的話,Apache網站上的一些java工具,比如ant之類的,可以在了解其作用的情況下看源碼分析功能的實現。

Ⅷ java線程池怎麼實現

要想理解清楚java線程池實現原理,明白下面幾個問題就可以了:

(1):線程池存在哪些狀態,這些狀態之間是如何進行切換的呢?

(2):線程池的種類有哪些?

(3):創建線程池需要哪些參數,這些參數的具體含義是什麼?

(4):將任務添加到線程池之後運行流程?

(5):線程池是怎麼做到重用線程的呢?

(6):線程池的關閉

首先回答第一個問題:線程池存在哪些狀態;

查看ThreadPoolExecutor源碼便知曉:

[java]view plain

閱讀全文

與線程池源碼相關的資料

熱點內容
雲伺服器買了干點什麼 瀏覽:622
程序員桌面管理軟體 瀏覽:989
綠洲平台app做任務在哪裡 瀏覽:688
文檔中加密的格式 瀏覽:518
androidgallery效果 瀏覽:256
make編譯顯示無法分配內存 瀏覽:64
可編程式機械定時器 瀏覽:115
浙江增值稅發票安全伺服器地址 瀏覽:572
河南農信app上身份證更新在哪裡 瀏覽:735
戰地1被伺服器ban了怎麼辦 瀏覽:666
shell暫停命令 瀏覽:726
雲伺服器ecs更換可用區 瀏覽:325
菜鳥裹裹的加密有什麼用 瀏覽:187
農商銀行app賬號是什麼格式 瀏覽:979
liunx安裝androidsdk 瀏覽:595
顯卡雲伺服器對比知乎 瀏覽:179
怎麼判斷雨棚旁柱子是否加密 瀏覽:398
android掛號源碼 瀏覽:399
買車有什麼app可以查看車型 瀏覽:1002
如何保證公司伺服器安全 瀏覽:586