讀書筆記之《Java併發編程的藝術》-線程池和Executor的子孫們

讀書筆記部份內容來源書出版書,版權歸本書做者,若有錯誤,請指正。java

歡迎star、fork,讀書筆記系列會同步更新git

git
github

https://github.com/xuminwlt/j360-jdk編程

module併發

j360-jdk-thread/me.j360.jdk.concurrent框架

本系列分4篇異步

一、讀書筆記之《Java併發編程的藝術》-併發編程基礎ide

二、讀書筆記之《Java併發編程的藝術》-java中的鎖高併發

三、讀書筆記之《Java併發編程的藝術》-併發編程容器和框架(重要)工具

四、讀書筆記之《Java併發編程的藝術》-線程池和Executor的子孫們


本書前三章分別爲

  1. 併發編程的挑戰,也就是併發編程的原因所在

  2. 底層的實現原理

  3. java內存模型

分別從cpu x86,x64以及內存模型等概念中描述java對併發編程的實現和控制,概念較爲底層和基礎,讀書筆記略過前三章直接從第四章應用實現及原理基礎開始。

章節

  1. 併發編程基礎

  2. java中的鎖

  3. 併發容器和框架(重點)

  4. 13個操做原子類

  5. java併發工具類

  6. 線程池

  7. Execurot框架

內容

寫到第六七節終於有點小激動了,由於到這裏結束就意味着能夠開開心心的去寫高併發底層了,但實際上開發中用到最多的仍是線程池的設計和併發Executor的使用,在下一節會對這兩節的內容用一套完整的框架來實踐線程池和Executor的使用案例,其實還有一本書《七週七併發模型》第一個模型幾乎就把這本書完整的知識點歸納完了,可是由於做者針對的面不一樣,併發模型這本書更多的講述如何用好併發框架,達到最優的效果,併發編程的藝術更多的是介紹原理和概念,一併起來看收穫匪淺。

好了,再來複習下線程池吧,在以前的線程池的設計中使用的是jdk5以前的設計思路,在jdk5以後使用併發框架實現的線程池將會容易的多,可是性能和效率卻好得多。

六、線程池

先看一張ThreadPoolExecutor執行execute方法的執行示意圖

執行方法分4種狀況

  1. 若是當前運行的線程少於corePoolSize,則建立新線程來執行任務(這一個過程須要獲取全局鎖)

  2. 若是當前運行線程數等於或者多餘corePoolSize,則加入到隊列BlockQueue

  3. 若是沒法加入到BlockQueue(隊列已滿),則建立新的線程來處理任務,(須要獲取全局鎖)

  4. 若是建立的線程將使得當前運行的線程數量大於MaximunPoolSize,任務將被拒絕,並調用很是重要的RejuectExecutionHandler.rejectExecution()方法

線程池的建立
new ThreadPoolExecutor(corePoolSize,maximunPoolSize,keepAliveTime,milliseconds,runnableTaskQueue,handler);

共6個參數

  1. corePoolSize,線程池的基本大小

  2. runnableTaskQueue:用於保存等待執行的任務的阻塞隊列,能夠有如下選擇

    1. ArrayBlockingQueue

    2. LinkedBlockingQueue

    3. synchronousQueue

    4. priorityBlockingQueue

  3. maximumPoolSze:線程池最大數量

  4. ThreadFacotry:用於設置建立線程的工廠

  5. RejectedExecutionHandler:飽和策略

  6. keepAliveTime:線程保持活動的時間

  7. TimeUtil:線程保持活動的單位

線程池提交任務

分別爲execute()/submit()

threadPool.execute(new Runnable(){
    @override
    public void run(){
        //run
    }
})
Future<Object> future = executor.submit(harReturnValuetask);
try{
 Object s = futrue.get();
}catch(InterruptedException e){
}catch(ExecutionException e){
}finally{
 //關閉線程池
 executor.shutdown();
}
關閉線程池

shutdown()、shutdownNow()

線程池的監控

taskCount、completedTaskCount、largestPoolSize、getpoolSize,getActiveCount

經過重寫線程池的beforeExecutor、afterExecutor、terminated方法


七、Executor框架

Executor框架由3大部分組成

  1. 任務:被執行任務須要實現的接口Runnable、Callable

  2. 任務的進行:任務執行機制的核心接口Executor,繼承Executor的ExecutorService

  3. 異步計算的結果:Future和實現了Future接口的FutureTask類

Execurot是Executor框架的基礎,將任務的提交和任務的執行分離開來

相關文章
相關標籤/搜索