《java并发编程实战》读书笔记5--任务执行, Executor框架
第6章 任务执行
6.1 在线程中执行任务
第一步要找出清晰的任务边界。大多数服务器应用程序都提供了一种自然的任务边界选择方式:以独立的请求为边界。
-6.6.1 串行地执行任务
最简单的任务调度策略是在单个线程中串行地执行各项任务。

虽然简单明了,但是每次只能处理一个请求。当服务器正在处理请求时,新到来的连接必须等待直到请求处理完成,然后服务器将再次调用accept。
-6.1.2 显示地为任务创建线程

-6.1.3 无限制创建线程的不足
(1) 线程生命周期的开销非常高
(2) 资源消耗
(3) 稳定性: 在可创建线程的数量上存在一个限制,这个限制值随着平台的不同而不同并受到多个因素制约,包括JVM启动参数,Thread构造函数中请求的栈大小,以及底层操作系统对线程的限制等。
6.2 Executor框架
java.util.concurrent提供了一种灵活的线程池作为Executor框架的一部分。

Executor基于生产者-消费者模式,提交任务的操作相当于生产者,执行任务的线程则相当于消费者。
-6.2.1 示例:基于Executor的web服务器

通过使用Executor,将请求任务的提交与任务的实际执行解耦,并且只需采用另一种不同的Executor实现,就可以轻松改变服务器的行为:


-6.6.2 执行策略

-6.2.3 线程池
通过调用Executor中的静态工厂方法来创建一个线程池:

-6.2.4 Executor生命周期
虽然知道如何创建一个Executor,但现在却不知道如何关闭它。JVM只有在所有的非守护线程全部终止后才会退出。因此,如果无法正确地关闭Executor,那么JVM将无法结束。Executor扩展了ExecutorService接口,添加了一些用于生命周期管理方法:




-6.2.5 延迟任务与周期任务
Timer类负责管理延迟任务以及周期任务,但是存在一些缺陷,因此考虑使用ScheduledThreadPoolExecutor来代替它。

ps:这里吐槽下这本书的汉化版,102页的图顺序贴错了,汉化版的质量实在是不敢恭维。
6.3 找出可利用的并行性
若使用Executor,必须将任务表述为一个Runnable。 有时候任务边界并非显而易见的。在单个用户请求中仍可能存在可发掘的并行性。
-6.3.1 示例:串行的页面渲染器
先绘制文本元素,同时为图像预留出矩形占位空间,在处理完了第一篇文本后,程序再开始下载图像,并将它们绘制到相应的占位空间中:

我们可以就将问题分解为多个独立的任务并发执行,从而获得更高的CPU利用率和响应灵敏度。
-6.3.2 携带结果的任务Callable和Future




ExecutorService中的所有方法都将返回一个Future,从而将一个Runnable或Callable提交给Executor,并得到一个Future来获得任务的执行结果或取消任务。

-6.3.3 示例:使用Future实现页面渲染器
为了使页面渲染器实现更高的并发性,首先将渲染任务分解成两个任务:一个是渲染所有的文本,另一个是下载所有图像:

-6.3.4 在异构任务并行中存在的局限
-6.3.5 CompletionService:Executor与BlockingQueue
CompletionService将Executor和BlockingQueue的功能融合在一起,可已将Callable任务提交给它来执行,然后使用类似于队列操作的take和poll方法来获得以完成的结果,这些结果在完成时将被封装成Future。ExecutorCompletionService实现了CompletionService,并将计算部分委托给一个Executor。CompletionService和ExecutorCompletionService详解


-6.3.6 示例:使用CompletionService实现页面渲染器
为每一幅图像的下载都创建一个独立的任务,并在线程池中执行它们。此外,通过从CompletionService中获取结果以及使每张图片在下载完成后立刻显示出来,能使用户获得一个更加动态和响应的用户界面:

-6.3.7 为任务设置时限


-6.3.8 示例:旅行预定门户网站




小结:

《java并发编程实战》读书笔记5--任务执行, Executor框架的更多相关文章
- Java并发编程实战 读书笔记(一)
最近在看多线程经典书籍Java并发变成实战,很多概念有疑惑,虽然工作中很少用到多线程,但觉得还是自己太弱了.加油.记一些随笔.下面简单介绍一下线程. 一 线程与进程 进程与线程的解释 个人觉 ...
- Java并发编程实战 读书笔记(二)
关于发布和逸出 并发编程实践中,this引用逃逸("this"escape)是指对象还没有构造完成,它的this引用就被发布出去了.这是危及到线程安全的,因为其他线程有可能通过这个 ...
- 《java并发编程实战》笔记
<java并发编程实战>这本书配合并发编程网中的并发系列文章一起看,效果会好很多. 并发系列的文章链接为: Java并发性和多线程介绍目录 建议: <java并发编程实战>第 ...
- Java多线程编程实战读书笔记(一)
多线程的基础概念本人在学习多线程的时候发现一本书——java多线程编程实战指南.整理了一下书中的概念制作成了思维导图的形式.按照书中的章节整理,并添加一些个人的理解.
- Java并发编程实践(读书笔记) 任务执行(未完)
任务的定义 大多数并发程序都是围绕任务进行管理的.任务就是抽象和离散的工作单元. 任务的执行策略 1.顺序的执行任务 这种策略的特点是一般只有按顺序处理到来的任务.一次只能处理一个任务,后来其它任 ...
- 《Java并发编程的艺术》第10章 Executor框架
Java的线程既是工作单元,也是执行机制.从JDK5开始,把工作单元与执行机制分离开来.工作单元包括Runnable和Callable,执行机制由Executor框架提供. 10.1 Executor ...
- Java并发编程实践读书笔记(5) 线程池的使用
Executor与Task的耦合性 1,除非线程池很非常大,否则一个Task不要依赖同一个线程服务中的另外一个Task,因为这样容易造成死锁: 2,线程的执行是并行的,所以在设计Task的时候要考虑到 ...
- Java并发编程艺术读书笔记
1.多线程在CPU切换过程中,由于需要保存线程之前状态和加载新线程状态,成为上下文切换,上下文切换会造成消耗系统内存.所以,可合理控制线程数量. 如何控制: (1)使用ps -ef|grep appn ...
- Java并发编程实践读书笔记(2)多线程基础组件
同步容器 同步容器是指那些对所有的操作都进行加锁(synchronize)的容器.比如Vector.HashTable和Collections.synchronizedXXX返回系列对象: 可以看到, ...
- Java并发编程实践读书笔记(1)线程安全性和对象的共享
2.线程的安全性 2.1什么是线程安全 在多个线程访问的时候,程序还能"正确",那就是线程安全的. 无状态(可以理解为没有字段的类)的对象一定是线程安全的. 2.2 原子性 典型的 ...
随机推荐
- 用live()方法给新增节点绑定事件
jQuery 给所有匹配的元素附加一个事件处理函数,即使这个元素是以后再添加进来的也有效. 这个方法是基本是的 .bind() 方法的一个变体.使用 .bind() 时,选择器匹配的元素会附加一个事件 ...
- 一款基础模型的JS打飞机游戏特效代码
<!DOCTYPE html> <html lang="en"> <head> <title>一款基础模型的JS打飞机游戏特效代码& ...
- SpringMVC源码解析-DispatcherServlet启动流程和初始化
在使用springmvc框架,会在web.xml文件配置一个DispatcherServlet,这正是web容器开始初始化,同时会在建立自己的上下文来持有SpringMVC的bean对象. 先从Dis ...
- HDU3949 XOR (线性基)
HDU3949 XOR Problem Description XOR is a kind of bit operator, we define that as follow: for two bin ...
- Cows POJ - 2481 树状数组
Farmer John's cows have discovered that the clover growing along the ridge of the hill (which we can ...
- iptables使用总结
推荐博文: http://www.zsythink.net/archives/1199 http://www.cnblogs.com/migongci0412/p/5198370.html 总结: 1 ...
- HDU3376 最小费用最大流 模板2
Matrix Again Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 102400/102400 K (Java/Others)To ...
- (第三章,第四章)http报文内的http信息,返回结果的http状态码
第三章 http报文内的http信息 用于http协议交互的信息被称为http报文,包括请求报文和响应报文. 1.编码提升传输速率,在传输时编码能有效的处理大量的访问请求.但是编码的操作是计算机完成的 ...
- MyBatis框架的使用及源码分析(九) Executor
从<MyBatis框架的使用及源码分析(八) MapperMethod>文中我们知道执行Mapper的每一个接口方法,最后调用的是MapperMethod.execute方法.而当执行Ma ...
- 简单的异步HTTP服务端和客户端
/// <summary> /// 异步Http服务器 /// </summary> class AsyncHttpServer { readonly HttpListener ...