读书笔记部分内容来源书出版书,版权归本书作者,如有错误,请指正。
欢迎star、fork,读书笔记系列会同步更新
git
https://github.com/xuminwlt/j360-jdk
module
j360-jdk-thread/me.j360.jdk.concurrent
本书前三章分别为
并发编程的挑战,也就是并发编程的缘由所在
底层的实现原理
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框架的基础,将任务的提交和任务的执行分离开来
读书笔记之《Java并发编程的艺术》-线程池和Executor的子孙们
原文:http://my.oschina.net/smartsales/blog/529044