《Java并发编程实战》和《Java并发编程的艺术》           Executor框架小结

1、在线程中如何执行任务

(1)任务执行目标:

在正常负载情况下,服务器应用程序要表现出良好的吞吐率和快速的响应性。在负载过载的情况下,应用程序的性能应该是逐渐减低的,而不是直接失败。

要实现高吞吐率和快速的响应,就应该选择清晰的任务边界和明确的任务执行策略。

(2)任务执行策略有:

1)单线程串行执行任务:缺点:无法提高服务器应用程序的吞吐率和快速响应速度

2)根据任务显示创建线程:缺点:无限创建线程太消耗资源;线程的创建和消耗开销高;易造成系统不稳定

3)利用线程池显示创建线程:

2、任务执行框架-Executor框架

早期Java的线程既是工作单元又是执行机制,而从JDK5开始,使用Runnable和Callable表示工作单元(任务)而由Executor框架负责提供任务的执行机制。

            Executor框架封装了多种不同的任务执行策略,实现了任务的提交与任务的执行的解耦,还提供了对线程生命周期的管理的支持等。

任务的表示:Runnable和Callable或者FutureTask

(1)Executor框架类图和Java队列类图

(2)线程池

线程池

特点

默认等待队列

适用场景

ThreadPoolExecutor

newFixedThreadPool

创建固定长度的线程池 返回通用的
ThreadPoolExecutor

无界队列LinkedBlockingQueue

适用于为了满足资源管理的需求,而需要限制当前线程数量的场景
适用于负载比较中的服务器

newCachedThreadPool

创建可缓存的线程池,空闲线程会被回收掉,线程池规模不受限制(即线程池大小不限制)返回通用的ThreadPoolExecutor

SynchronousQueue

适用于执行很多短期异步任务的小程序或者负载较轻的服务器

newSingleThreadExecutor

单线程的Executor,创建当个工作者线程来执行任务。
能确保按照任务队列中的顺序执行任务 返回通用的ThreadPoolExecutor

无界队列LinkedBlockingQueue

适用于需要保证顺序执行各个任务,并且在任意时间点不会有多个线程活动的场景

ScheduleThreadPoolExecutor

newScheduledThreadPool

创建固定的线程池并且以延迟或定时的方式来执行任务
返回ScheduledThreadPoolExecutor

无界阻塞队列DelayQueue

适用于需要多个线程在后台执行周期性任务,同事为了满足资源管理的需求而现在后台线程的数量的应用场景
适用于需要定时执行任务的场景

newSingleThreadScheduleThreadPool

创建单个线程以顺序延迟或者定式的方式执行任务
返回ScheduledThreadPoolExecutor

无界阻塞队列DelayQueue

适用于需要单个线程顺序执行周期性任务的场景

(3)Executor的生命周期(ExecutorService的接口)

Executor通过扩展ExecutorService接口新增了执行服务的生命周期管理方法,

ExecutorService的生命周期有3种状态:运行,关闭,已终止

ExecutorService接口方法介绍

方法名称

作用

返回参数

注意事项

shutdown() 关闭服务,执行平缓的的关闭过程,不再接受新的任务,同时等待所有的任务执行完成(包括已提交但未执行的任务); void  
shutdownNow() 立即关闭,并取消所有任务包括正在执行的和未执行的,然后返回已提交但未执行的任务(不包括那些正在执行被关闭的任务); List<Runnable>  
isShutdown(): 如果此执行程序已关闭,则返回 true boolean  
isTerminated(): 如果关闭后所有任务都已完成,则返回 true。注意,除非首先调用 shutdown 或 shutdownNow,否则 isTerminated 永不为 true。 boolean  
awaitTermination(long timeout,TimeUnit unit) 等待(阻塞)直到关闭或最长等待时间或发生中断
如果此执行程序终止,则返回 true;如果终止前超时期满,则返回 false
boolean  

execute(Runnable )

提交一个 Runnable 任务用于执行 void  
submit(Runnable ) 提交一个 Runnable 任务用于执行,并返回一个表示该任务的 Future。该 Future 的 get 方法在成功完成时将会返回给定的结果。

Future<?> 

 
submit(Callable<T> ) 提交一个返回值的任务用于执行,返回一个表示任务的未决结果的 Future。该 Future 的 get 方法在成功完成时将会返回该任务的结果。

Future<T>

 

invokeAll(Collection<? extends Callable<T>> tasks,long timeout,TimeUnit unit)

执行给定的任务,当所有任务完成或超时期满时(无论哪个首先发生),返回保持任务状态和结果的 Future 列表。返回列表的所有元素的 Future.isDone() 为 true。一旦返回后,即取消尚未完成的任务。
注意,可以正常地或通过抛出异常来终止已完成 任务。如果此操作正在进行时修改了给定的 collection,则此方法的结果是不确定的。
List<Future<T>>
表示任务的 Future 列表,列表顺序与给定任务列表的迭代器所生成的顺序相同。
     如果操作未超时,则已完成所有任务。如果确实超时了,则某些任务尚未完成。

注意1:该方法会一直阻塞直到所有任务完成或超时。
注意2:如果确实超时了,则某些任务尚未完成。【那么这些尚未完成的任务应该被系统取消】

invokeAll(Collection<? extends Callable<T>> tasks)

执行给定的任务,当所有任务完成时,返回保持任务状态和结果的 Future 列表。返回列表的所有元素的 Future.isDone() 为 true。
    注意,可以正常地或通过抛出异常来终止已完成 任务。如果正在进行此操作时修改了给定的 collection,则此方法的结果是不确定的。

List<Future<T>>

执行给定的任务,当所有任务完成时,返回保持任务状态和结果的 Future 列表。返回列表的所有元素的 Future.isDone() 为 true。
    注意,可以正常地或通过抛出异常来终止已完成 任务。如果正在进行此操作时修改了给定的 collection,则此方法的结果是不确定的。

该方法会一直阻塞直到所有任务完成。

(3)ScheduledThreadPoolExecutor实现延迟任务与周期任务

1)比较实现延迟任务与周期任务的两种方法:

特点

适用情况

Timer a.执行所有定时任务时只创建一个线程,任务执行时间过长时破坏其他定时任务的定时精确性
b.不能处理不捕获未处理异常,遇到未检查异常时将终止定时任务,造成“线程泄露”
c.基于绝对时间而不是相对时间的调度机制,任务的执行对系统时钟变化很敏感
少用
ScheduledThreadPoolExecutor 能够正确处理执行任务过程中出现的异常
b.基于相对时间的调度
推荐使用

2)如何构建自己的调度服务

使用DelayQueue为ScheduledThreadPoolExecutor提供调度功能。DelayQueue管理者一组Delayed对象,每个Delayed对象都有一个相应的延迟时间,每个Delayed对象逾期后才能从DelayQueue中执行take操作。

3、如何提高程序的并行性?找出同构并发执行任务

(1)任务的表示

Runnable:

Callable:可以返回任务执行的结果

(2)同构任务与异构任务

同构任务:并发执行性能提升少

异构任务:并发执行性能提升多

(3)Future与CompletionService

Future:作为单个计算句柄

CompletionService:作为一组计算的句柄,CompletionService将Executor和BlockingQueue的功能融合在一起。

CopletionService<ImageData> completionService=new ExecutorCompletService(executor);

completionService.submit(callable);

completionService.take();

(4)Future.get()与Future.get(TimeOut,TimeUnit)

Future.get() 任务不设时限

Future.get(TimeOut,TimeUnit)为任务设置时限

(5)Executor.invokeAll(List<Task>,TimeOut,TimeUnit)

将多个任务提交到ExecutorService并获得一组结果。

4、如何终止线程

5、Java中的线程池

6、Java中的并发工具类

7、并发编程实践

那些年读过的书《Java并发编程实战》和《Java并发编程的艺术》三、任务执行框架—Executor框架小结的更多相关文章

  1. 《Java并发编程的艺术》第10章 Executor框架

    Java的线程既是工作单元,也是执行机制.从JDK5开始,把工作单元与执行机制分离开来.工作单元包括Runnable和Callable,执行机制由Executor框架提供. 10.1 Executor ...

  2. 《java并发编程实战》读书笔记5--任务执行, Executor框架

    第6章 任务执行 6.1 在线程中执行任务 第一步要找出清晰的任务边界.大多数服务器应用程序都提供了一种自然的任务边界选择方式:以独立的请求为边界. -6.6.1 串行地执行任务 最简单的任务调度策略 ...

  3. Java多线程编程实战02:多线程编程模型

    多线程编程模型 线程安全名词 串行.并发和并行 串行:一个人,将任务一个一个完成 并发:一个人,有策略地同时做多件事情 并行:多个人,每人做一个事情 竞态 名词 竞态:计算结果的正确性与时间有关的现象 ...

  4. 《Java Web开发实战》——Java工程师必备干货教材

    一年一度毕业季,又到了简历.offer漫天飞,失望与希望并存的时节.在IT行业,高校毕业生求职时,面临的第一道门槛就是技能与经验的考验,但学校往往更注重学生的理论知识,忽略了对学生实践能力的培养,因而 ...

  5. java并发编程实战(java concurrency in practice)

    第一章   线程共享进程范围内的资源,但每个线程都有各自的程序计数器.栈以及局部变量等. 多个线程可以同时调度到多个CPU上运行.   线程的优势? 在服务应用程序中,可以提升资源利用率以及系统吞吐率 ...

  6. Java 并发系列之一:java 并发体系

    1.  java 并发机制的底层原理实现 1.1 volatile 1.2 synchronized 1.3 原子操作 2. java 内存模型(JMM) 3. java并发基础线程 4. java ...

  7. 【Java 并发】Executor框架机制与线程池配置使用

    [Java 并发]Executor框架机制与线程池配置使用 一,Executor框架Executor框架便是Java 5中引入的,其内部使用了线程池机制,在java.util.cocurrent 包下 ...

  8. Java并发编程系列-(6) Java线程池

    6. 线程池 6.1 基本概念 在web开发中,服务器需要接受并处理请求,所以会为一个请求来分配一个线程来进行处理.如果每次请求都新创建一个线程的话实现起来非常简便,但是存在一个问题:如果并发的请求数 ...

  9. Java 并发系列之四:java 多线程

    1. 线程简介 2. 启动和终止线程 3. 对象及变量的并发访问 4. 线程间通信 5. 线程池技术 6. Timer定时器 7. 单例模式 8. SimpleDateFormat 9. txt ja ...

随机推荐

  1. Java编程的逻辑 (86) - 动态代理

    ​本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...

  2. Navi.Soft31.微信WinForm框架(含下载地址)

    1.概述 1.1应用场景 微信的出现,改变了我们日常生活.而微信公众平台的出现,使我们每个人都可能成为一个品牌,微商的普及.微店越来越多.越来越多的人,借助微信公众平台,实现了自己的梦想 在此背景环境 ...

  3. modelsim 中如何加载多个对比波形文件

    首先选中波形,然后点击file----datasets. 选中sim文件,然后点击save as. 对所保存的文件命名.完成之后点击done即可. 在完成上述的加载波形之后,会有多个.wlf文件,如上 ...

  4. 第三百九十五节,Django+Xadmin打造上线标准的在线教育平台—Xadmin集成富文本框

    第三百九十五节,Django+Xadmin打造上线标准的在线教育平台—Xadmin集成富文本框 首先安装DjangoUeditor3模块 Ueditor HTML编辑器是百度开源的HTML编辑器 下载 ...

  5. xml 转map dom4j

    http://ziyu-1.iteye.com/blog/469003 传过来一个xml文件,需要转换成Map,能够应对不用结构的xml,而不是只针对固定格式的xml. 转换规则: 1.主要是Map与 ...

  6. winform利用ImageList控件和ListView控件组合制作图片文件浏览器

    winform利用ImageList控件和ListView控件组合制作图片文件浏览器,见图,比较简单,实现LISTVIEW显示文件夹图片功能. 1.选择文件夹功能代码: folderBrowserDi ...

  7. [Laravel] 15 - REST API: sidebar with unit test

    前言 实现一个博客的侧边栏的链接,然后顺便对其进行单元测试的过程. Archives 一.视图中展示SQL结果 一条 sql 语句[查询] select year(created_at) year, ...

  8. 【GIS】Vue修改图层透明度

    1.添加透明度控制条 <input id="slider" type="range" min="0" max="1" ...

  9. N76E003 工程创建教程

    一.准备工作: 1.下载编译工具keil c51 2.下载N76E003提供的板级支持包(BSP),可到nuvoton上下载   二.开发环境搭建 1.安装keil c51,然后和谐...不能随便发链 ...

  10. vagrant up connection time out

    vagrant up connection time out 在一台重装系统的机子上装vagrant后 vagrant up 无法启系统 D:\work\vagrant>vagrant up B ...