读书笔记之《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框架的基础,将任务的提交和任务的执行分离开来

相关文章
相关标签/搜索