java 執行緒池基本用法
阿新 • • 發佈:2018-12-30
1,執行緒與程序的基本區別
->程序:
擁有自己一整套變數,資料之間不可見。建立/撤銷-開銷很大。
->執行緒:
共享資料,共享變數儲存在主存中(Main Memory),每個現場有自己私有的本地記憶體(Local Memory),本地記憶體存的是主存的一個副本,與程序相比,執行緒很"輕量",建立/撤銷-開銷比較小
2,實現一個執行緒的幾種方式
class MyThread extends Thread { @Override public void run() { //要執行的業務程式碼 } } class MyRunner implements Runnable { @Override public void run() { //要執行的業務程式碼 } } //可以用執行緒池來執行 class MyCallable implements Callable<Object>{ @Override public Object call() throws Exception{ //要執行的業務程式碼 return null; } }
3,Thread.start和Thread.run
Thread.start代表開啟一個執行緒,如果這個執行緒獲取到了CPU資源,處於執行態的話,就會執行業務程式碼,很顯然開啟執行緒,不一定會執行業務程式碼。
但是Thread.run,代表直接呼叫的run方法,作為普通的方法呼叫。
4,ThreadPoolExecutor七個引數的基本用法
ThreadPoolExecutor( int corePoolSize, int maxiNumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, THreadFactory tHreadFactory, RejectedExecutionHandler rejectedExecutionHandler ); corePoolSize : 核心執行緒數,也就是執行緒池創建出來去執行使用者任務的執行緒個數,執行緒會呼叫任務的run方法(注意是呼叫run方法,而不是start開啟執行緒)。如果使用者提交的任務個數小於這個值,任務將會馬上被執行(有點絕對的說法,但是意思上也差不多)。 maxiNumPoolSize : 執行緒池能夠建立執行緒的最大值,什麼時候回動用這個值?就是當用戶提交的任務大於了corePoolSize,且超過了工作佇列workQueue可容納的最大值,就會在corePoolSize這個的基礎上再建立執行緒去處理任務(也就是任務量太多,執行緒池會加大處理的速度),但是總的執行緒數目不會超過maxiNumPoolSize。如果當前執行緒池建立的執行緒最大化了,workQueue滿了,就會拒絕使用者任務的加入。 workQueue :用來儲存使用者提交的任務佇列,用的是阻塞佇列(阻塞佇列有什麼特性,請看看JAVA的API以及原始碼)。 tHreadFactory : 執行緒池的執行緒工廠類,用來建立執行緒用的,一般就用執行緒池預設的好了。 rejectedExecutionHandler : 這個引數代表執行緒池拒絕使用者新增任務的處理策略。有四種處理方式:ThreadPoolExecutor.AbortPolicy(直接丟棄任務,丟擲異常,預設),ThreadPoolExecutor.DicardPolicy(直接丟棄任務,不丟擲異常),ThreadPoolExecutor.DicardOldestPolicy(丟棄最前面的任務,然後嘗試重新執行任務),ThreadPoolExecutor.CallerRunsPolicy(由呼叫現場處理任務,成功與否聽天由命)
5,執行緒池用法舉例
在使用執行緒池來併發執行任務時,需要考慮任務完成一次需要的時間,任務量多少,已經任務空閒時間需要多級,仔細評估以後,設定適合的引數,才能讓執行緒池更好的為業務程式碼服務。