读书笔记部份内容来源书出版书,版权归本书做者,若有错误,请指正。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框架的基础,将任务的提交和任务的执行分离开来