執行緒池threadpoolexecutor
自定義執行緒池
執行緒池其實就是一種多執行緒處理形式,處理過程中可以將任務新增到佇列中,然後在建立執行緒後自動啟動這些任務,這裡的執行緒就是我們之前學過的執行緒,這裡的任務就是我們之前學過的實現runnable介面或者callable介面的例項物件。
使用執行緒池最大的原因就是可以根據系統的需求和硬體的環境靈活的控制線程的數量,並且可以對所有的執行緒進行統一的管理和控制,從而提高系統的執行效率,降低系統執行壓力。
1、執行緒和任務分離,提公升執行緒的復用性。
2、控制線程併發數量,降低伺服器壓力,統一管理所有的執行緒
3、提公升系統響應速度,加入建立乙個執行緒時間為t1,執行任務的時間為t2,銷毀執行緒的時間為t3,如果使用執行緒,可以省略t1和t3。
1、網購商品秒殺。
3、票務網購票系統
總結:只要有併發的地方,任務數量或大或小,每個任務執行時間或長或短都可以使用執行緒池,只不過使用執行緒池的時候,注意一下設定合理的執行緒池大小。
使用內建執行緒池:threadpoolexecutor();
解析構造方法
//構造方法
public
threadpoolexecutor
(int corepoolsize,
//核心執行緒數
int maximumpoolsize,
//最大執行緒數
long keepalivetime,
//最大空閒時間
timeunit unit,
//時間單位
blockingqueue
workqueue,
//任務佇列
threadfactory threadfactory,
//執行緒工廠
rejectedexecutionhandler handler//飽和處理機制。)/*
對上面的引數進行解釋
1、corepoolsize:核心執行緒數,當有任務提交到執行緒池之後,如果當前執行的執行緒數量沒有達到核心執行緒數量,新開乙個執行緒來執行任務。如果達到了核心執行緒數量,可以通過最大執行緒數量。只負責初始化執行緒池的時候或者提交任務的時候,允許建立出來的執行緒數量。
2、maximumpoolsize:最大執行緒數量
3、keepalivetime:最大的空閒時間,空閒執行緒最大存活時間,超過空閒時間,執行緒池將**這些執行緒。
4、timeunit:是乙個列舉型別,
5、blockingqueue:任務佇列,理解成乙個集合,當我們的執行緒數量達到核心執行緒數量之後,如果再有任務提交到執行緒池,不會立馬建立新執行緒,會把任務放到任務佇列中,只有任務佇列存滿了,按照設定的最大執行緒數量建立新的執行緒。
6、threadfactory:執行緒工廠,允許自己參與建立執行緒的過程,用自己的方式建立執行緒,實現介面即可。
7、rejectedexecutionhandler:飽和處理機制,當任務數量達到核心執行緒總數量,最大執行緒數量也建立完了,任務佇列也存滿了,還有任務的時候,執行緒池已經容納不了這麼多工,就給出乙個飽和處理機制,
*/
自定義執行緒池-引數的分析
自定義執行緒池實現的步驟
編寫任務類
/**
* @author alon
* @title: mytask
* @projectname poolexecutordemo
* @description: 任務類,為了看清楚誰在執行,需要定義乙個編號,並且實現runnable介面
* @date 2020/8/16 20:38
*/public
class
mytask
implements
runnable
//重寫run方法
@override
public
void
run(
)catch
(interruptedexception e)
system.out.
println
("執行緒:"
+name+
"完成任務編號:"
+id);}
//重寫tostring方法
@override
public string tostring()
';}}
程式設計執行緒類
/**
* @author alon
* @title: myworker
* @projectname poolexecutordemo
* @description: 編寫乙個執行緒類,用於執行執行緒任務,需要定義乙個變數來記錄執行緒的名字
* 需要定義乙個集合容器,用來儲存任務列表
* 執行緒的執行,需要繼承thread類
* @date 2020/8/16 20:49
*/public
class
myworker
extends
thread
//重寫run方法
public
void
run()}
}
編寫乙個執行緒池類
/**
* @author alon
* @title: mythreadpool
* @projectname poolexecutordemo
* @description:自定義執行緒池
* 成員屬性:
* 1、需要集合容器,用來儲存任務佇列,需要保執行緒安全
* 2、需要當前執行緒數
* 3、需要核心執行緒數
* 4、需要最大執行緒數
* 5、任務佇列長度
* 成員方法:
* 1、提交任務,提交後會存入任務佇列
* 2、執行任務,將乙個乙個的執行任務
* @date 2020/8/16 20:55
*/public
class
mythreadpool
//提交任務的方法
public
void
submit
(runnable r)
else
}//執行任務
public
void
executetask
(runnable r)
else
if(number < maxsize)
else
}}
測試類
/**
* @author alon
* @title: mytest
* @projectname poolexecutordemo
* @description: 測試自定義執行緒類
* @date 2020/8/16 23:07
*/public
class
mytest
}}
到這裡執行緒的基礎使用就結束了 基礎的執行緒池
實際專案中 需要非常多的執行緒 建立跟銷毀執行緒的開銷較大,又會用到較多的執行緒,不妨在建立不用之後,將其儲存起來,待使用時再呼叫 這就引入了執行緒池的概念 executorservice es executors.newfixedthreadpool 建立新的執行緒池物件,引數是int 表示建立的...
執行緒池 基礎
概念 乙個執行緒的宣告週期中包含了三個時間段,1是建立執行緒的時間 t1,2是執行緒執行任務所要花費的時間 t2,3是執行緒銷毀的時間 t3,執行緒池主要技術點就是縮短或調整t1和t3的時間,從而提高伺服器的效能。因為它把t1和t3安排在程式啟動或者伺服器空閒的時間段中,這樣就不會有t1和t3的開銷...
執行緒池基礎
1 重用執行緒,避免執行緒建立和消耗帶來的效能消耗 2 控制線程池的最大併發數,避免執行緒之間搶系統資源而導致的阻塞現象。3 對執行緒管理,提供定時執行等功能。1 executor介面 public inte ce executor將任務提交和執行解耦,引數傳入runnable 任務 通過execu...