讀書筆記部份內容來源書出版書,版權歸本書做者,若有錯誤,請指正。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的子孫們
本書前三章分別爲
併發編程的挑戰,也就是併發編程的原因所在
底層的實現原理
java內存模型
分別從cpu x86,x64以及內存模型等概念中描述java對併發編程的實現和控制,概念較爲底層和基礎,讀書筆記略過前三章直接從第四章應用實現及原理基礎開始。
併發編程基礎
java中的鎖
併發容器和框架(重點)
13個操做原子類
java併發工具類
線程池
Execurot框架
寫到第六七節終於有點小激動了,由於到這裏結束就意味着能夠開開心心的去寫高併發底層了,但實際上開發中用到最多的仍是線程池的設計和併發Executor的使用,在下一節會對這兩節的內容用一套完整的框架來實踐線程池和Executor的使用案例,其實還有一本書《七週七併發模型》第一個模型幾乎就把這本書完整的知識點歸納完了,可是由於做者針對的面不一樣,併發模型這本書更多的講述如何用好併發框架,達到最優的效果,併發編程的藝術更多的是介紹原理和概念,一併起來看收穫匪淺。
好了,再來複習下線程池吧,在以前的線程池的設計中使用的是jdk5以前的設計思路,在jdk5以後使用併發框架實現的線程池將會容易的多,可是性能和效率卻好得多。
先看一張ThreadPoolExecutor執行execute方法的執行示意圖
執行方法分4種狀況
若是當前運行的線程少於corePoolSize,則建立新線程來執行任務(這一個過程須要獲取全局鎖)
若是當前運行線程數等於或者多餘corePoolSize,則加入到隊列BlockQueue
若是沒法加入到BlockQueue(隊列已滿),則建立新的線程來處理任務,(須要獲取全局鎖)
若是建立的線程將使得當前運行的線程數量大於MaximunPoolSize,任務將被拒絕,並調用很是重要的RejuectExecutionHandler.rejectExecution()方法
new ThreadPoolExecutor(corePoolSize,maximunPoolSize,keepAliveTime,milliseconds,runnableTaskQueue,handler);
共6個參數
corePoolSize,線程池的基本大小
runnableTaskQueue:用於保存等待執行的任務的阻塞隊列,能夠有如下選擇
ArrayBlockingQueue
LinkedBlockingQueue
synchronousQueue
priorityBlockingQueue
maximumPoolSze:線程池最大數量
ThreadFacotry:用於設置建立線程的工廠
RejectedExecutionHandler:飽和策略
keepAliveTime:線程保持活動的時間
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框架由3大部分組成
任務:被執行任務須要實現的接口Runnable、Callable
任務的進行:任務執行機制的核心接口Executor,繼承Executor的ExecutorService
異步計算的結果:Future和實現了Future接口的FutureTask類
Execurot是Executor框架的基礎,將任務的提交和任務的執行分離開來