《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. iOS系统及客户端软件测试的基础介绍

    iOS系统及客户端软件测试的基础介绍 iOS现在的最新版本iOS5是10月12号推出,当前版本是4.3.5 先是硬件部分,采用iOS系统的是iPad,iPhone,iTouch这三种设备,其中iPho ...

  2. Vue.js常用指令:v-model

    一.v-model指令 v-model 用来获取表单元素的值.对应input输入框获取的是输入的值,单选按钮.复选框.下拉框获取的是选择的状态. 代码示例如下: <!DOCTYPE html&g ...

  3. python3二元Logistics Regression 回归分析(LogisticRegression)

    纲要 boss说增加项目平台分析方法: T检验(独立样本T检验).线性回归.二元Logistics回归.因子分析.可靠性分析 根本不懂,一脸懵逼状态,分析部确实有人才,反正我是一脸懵 首先解释什么是二 ...

  4. ajax实战用法详解

    谦虚使人进步,总结使人提高! 以下5个方法执行一般Ajax请求的简短形式,在处理复杂的Ajax请求时应该使用jQuery.ajax() 1.load(url,[data],[callback])载入远 ...

  5. Spark学习笔记——手写数字识别

    import org.apache.spark.ml.classification.RandomForestClassifier import org.apache.spark.ml.regressi ...

  6. [Bayes] dchisq: Metropolis-Hastings Algorithm

    dchisq gives the density,                          # 计算出分布下某值处的密度值 pchisq gives the distribution fun ...

  7. post请求参数问题

    from:https://www.cnblogs.com/btgyoyo/p/6141480.html jQuery的ajax方法和post方法分别发送请求,在后台Servlet进行处理时结果是不一样 ...

  8. @Cacheable注解式缓存不起作用的情形

    @Cacheable注解式缓存使用的要点:正确的注解式缓存配置,注解对象为spring管理的hean,调用者为另一个对象.有些情形下注解式缓存是不起作用的:同一个bean内部方法调用,子类调用父类中有 ...

  9. [原]Jenkins(十三)---jenkins用户权限管理

    * 版权声明:本博客欢迎转发,但请保留原作者信息! http://www.cnblogs.com/horizonli/p/5337874.html 两种策略的比较

  10. 【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验五:按键模块④ — 点击,长点击,双击

    实验五:按键模块④ - 点击,长点击,双击 实验二至实验四,我们一共完成如下有效按键: l 点击(按下有效) l 点击(释放有效) l 长击(长按下有效) l 双击(连续按下有效) 然而,不管哪个实验 ...