第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框架的更多相关文章

  1. Java并发编程实战 读书笔记(一)

    最近在看多线程经典书籍Java并发变成实战,很多概念有疑惑,虽然工作中很少用到多线程,但觉得还是自己太弱了.加油.记一些随笔.下面简单介绍一下线程. 一  线程与进程   进程与线程的解释   个人觉 ...

  2. Java并发编程实战 读书笔记(二)

    关于发布和逸出 并发编程实践中,this引用逃逸("this"escape)是指对象还没有构造完成,它的this引用就被发布出去了.这是危及到线程安全的,因为其他线程有可能通过这个 ...

  3. 《java并发编程实战》笔记

    <java并发编程实战>这本书配合并发编程网中的并发系列文章一起看,效果会好很多. 并发系列的文章链接为:  Java并发性和多线程介绍目录 建议: <java并发编程实战>第 ...

  4. Java多线程编程实战读书笔记(一)

    多线程的基础概念本人在学习多线程的时候发现一本书——java多线程编程实战指南.整理了一下书中的概念制作成了思维导图的形式.按照书中的章节整理,并添加一些个人的理解.

  5. Java并发编程实践(读书笔记) 任务执行(未完)

    任务的定义 大多数并发程序都是围绕任务进行管理的.任务就是抽象和离散的工作单元.   任务的执行策略 1.顺序的执行任务 这种策略的特点是一般只有按顺序处理到来的任务.一次只能处理一个任务,后来其它任 ...

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

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

  7. Java并发编程实践读书笔记(5) 线程池的使用

    Executor与Task的耦合性 1,除非线程池很非常大,否则一个Task不要依赖同一个线程服务中的另外一个Task,因为这样容易造成死锁: 2,线程的执行是并行的,所以在设计Task的时候要考虑到 ...

  8. Java并发编程艺术读书笔记

    1.多线程在CPU切换过程中,由于需要保存线程之前状态和加载新线程状态,成为上下文切换,上下文切换会造成消耗系统内存.所以,可合理控制线程数量. 如何控制: (1)使用ps -ef|grep appn ...

  9. Java并发编程实践读书笔记(2)多线程基础组件

    同步容器 同步容器是指那些对所有的操作都进行加锁(synchronize)的容器.比如Vector.HashTable和Collections.synchronizedXXX返回系列对象: 可以看到, ...

  10. Java并发编程实践读书笔记(1)线程安全性和对象的共享

    2.线程的安全性 2.1什么是线程安全 在多个线程访问的时候,程序还能"正确",那就是线程安全的. 无状态(可以理解为没有字段的类)的对象一定是线程安全的. 2.2 原子性 典型的 ...

随机推荐

  1. spring的RestTemplate使用指南

    前言:现在restful接口越来越广泛,而如今很多接口摒弃了传统的配置复杂的webService开发模式,在java领域只需要很简单的springMvc就可以声明为一个控制器,再加上service层, ...

  2. Apache Flume - File通道设计

    原文链接:https://blogs.apache.org/flume/entry/apache_flume_filechannel 说明:翻译在尽量符合原文表达的基础上,尽量保证行文流畅.水平有限, ...

  3. git branch 重命名

    有时候你会有重命名一个git branch的冲动,不要怀疑,这是真的.command bellow will give u a big help,no thanks~ git branch - m o ...

  4. [ASP.NET]从ASP.NET Postback机制,到POST/GET方法

    写这篇博客的起源来自于自己最近在学习ASP.NET时对于 PostBack机制的困惑.因为自己在解决困惑地同时,会不断产生新的疑问,因此博客最后深入到了http 包的格式和Internet所使用的TC ...

  5. JS开发中自定义调试信息开关

    在开发过程中,可能随处留下几个console.log,或者alert语句,这些语句在开发过程中是很有价值的.但是项目一旦进入生产环境,过多的console.log可能影响到浏览器的运行效率,过多的al ...

  6. 任何用户密码都能以sysdba角色登入

    这是因为在安装Oracle的时候默认是使用了操作系统验证: 数据库用sysdba登录的验证有两种方式,一种是通过os认证,一种是通过密码文件验证:登录方式有两种,一种是在数据库主机直接登录(用os认证 ...

  7. 怎么修改jar包中的class文件然后再重新打成jar包

    1.导入到eclipse中, 修改完了 然后导出jar即可 2.jar cf file.jar *.class 将当前目录下所有CLASS文件打包成新的JAR文件 3.对于补丁.之前已经有jar 例如 ...

  8. nginx 负载均衡实现

    https://www.cnblogs.com/wang-meng/p/5861174.html

  9. 【设计模式】 模式PK:策略模式VS状态模式

    1.概述 行为类设计模式中,状态模式和策略模式是亲兄弟,两者非常相似,我们先看看两者的通用类图,把两者放在一起比较一下. 策略模式(左)和状态模式(右)的通用类图. 两个类图非常相似,都是通过Cont ...

  10. PHP日期时间操作

    一.设置时区 date_default_timezone_set('PRC'); 二.获取当前时间的 Unix 时间戳(格林威治时间 1970 年 1 月 1 日 00:00:00到当前时间的秒数)和 ...