一、 在线程中运行任务


无限制创建线程的不足
.线程生命周期的开销很高
.资源消耗
.稳定性

二、Executor框架

Executor基于生产者-消费者模式。提交任务的操作相当于生产者。运行任务的线程则相当于消费者。


1. Executors 返回 ExecutorService

2. ExecutorService方法submit、execute

3. ExecutorService.submit 返回 Future

线程池,Executors方法介绍
方法名 解释
newFixedThreadPool 将创建一个固定长度的线程池,每当提交一个任务时就创建一个线程,知道达到线程池的最大数量,这时线程池的规模将不再变化(假设某个线程因为发生了未预期的Exception而结束。那么线程池会补充一个新的线程。)
newCachedThreadPool 将创建一个可缓存的线程池,假设线程池的当前规模超过了处理需求时,那么将回收空暇的线程,而当需求添加时,则能够加入新的线程。线程池的规模不存在不论什么限制。

newSingleThreadExecutor 将会创建一个单线程的Executor。它创建单个工作者线程来运行任务。假设这个线程异常结束,会创建还有一个线程来替代。newSingleThreadExecutor能确保按照任务在队列中的顺序来串行运行(比如FIFO、LIFO、优先级)
newScheduledThreadPool 创建了一个固定长度的线程池。并且以延迟或定时的方式来运行任务,类似于Timer。


Executor的生命周期

以上四个方法都会返回ExecutorService。ExecutorService的生命周期有3种状态:执行、关闭和已终止。
方法名 解释
shutdown 将运行平缓的关闭过程:不再接受新的任务。同一时候等待已经提交的任务运行完毕—包含那些还未開始运行的任务。

shutdownNow 将运行粗暴的关闭过程:它将尝试取消全部运行中的任务。而且不再启动队列中尚未開始运行的任务。


Timer类负责管理延迟任务

三、找出可利用的并行性

1. 任务拆分到多个子线程处理。

2. 携带结果的任务Callable与Futrue

Executor运行任务的4个生命周期:创建,提交。開始,完毕。


任务的提交者和运行者之间的通讯手段
ExecutorService executor = Executors.newSingleThreadExecutor();
Callable<Object> task = new Callable<Object>() {
public Object call() throws Exception {
Object result = "...";
return result;
}
};
Future<Object> future = executor.submit(task);
future.get(); // 等待至完毕 Future<Object> future = executor.submit(task);
// 等待到任务被运行完毕返回结果
// 假设任务运行出错,这里会抛ExecutionException
future.get();
//等待3秒。超时后会抛TimeoutException
future.get(3, TimeUnit.SECONDS); Callable<Object> task = new Callable<Object>() {
public Object call() throws Exception {
Object result = …;
return result;
}
};

有两种任务:

Runnable

Callable - 须要返回值的任务




Task Submitter把任务提交给Executor运行,他们之间须要一种通讯手段,这样的手段的详细实现。通常叫做Future。

Future通常包含get(堵塞至任务完毕), cancel,get(timeout)(等待一段时间)

等等。Future也用于异步变同步的场景。



3、4. 在异构任务并行化中存在的局限
假设一个任务是读取IO资源,能够使用多个线程去同一时候读取,可是效率上限可能出在IO上,即使开启再多线程读取总速度也不可能超出IO读取速度上限。
开启多个线程本身也会调高编程难度,同一时候开启多个线程也会造成资源消耗。
多线程提高效率非常多时候并非添加一个线程效率提高一倍。可能提高的效率微乎其微。

5. Executor与BlockingQueue
假设想提交一组计算任务。而且希望在计算完毕后获得结果,能够使用BlockingQueue保存每一个任务的Future。


7. 为任务设置时限
//等待3秒,超时后会抛TimeoutException

future.get(3,  TimeUnit.SECONDS);


8. ExecutorService.invokeAll()

运行给定的任务,当全部任务完毕时,返回保持任务状态和结果的 Future 列表。

返回列表的全部元素的 Future.isDone() 为 true。注意,能够正常地或通过抛出异常来终止已完毕 任务。假设正在进行此操作时改动了给定的 collection,则此方法的结果是不确定的。



四、资料:

《温绍锦 - Java并发程序设计教程》
     摘录“任务的提交者和运行者”。“任务的提交者和运行者之间的通讯手段” 


聊聊并发(三)——JAVA线程池的分析和使用(原理)

http://www.infoq.com/cn/articles/java-threadPool



Java(Android)线程池(使用)

http://www.trinea.cn/android/java-android-thread-pool/



Java Thread Pool Example using Executors and ThreadPoolExecutor

http://www.journaldev.com/1069/java-thread-pool-example-using-executors-and-threadpoolexecutor



工具能够查看线程数

jconsole.exe

《Java并发编程实战》第六章 任务运行 读书笔记的更多相关文章

  1. 《Java并发编程实战》第二章 线程安全性 读书笔记

    一.什么是线程安全性 编写线程安全的代码 核心在于要对状态訪问操作进行管理. 共享,可变的状态的訪问 - 前者表示多个线程訪问, 后者声明周期内发生改变. 线程安全性 核心概念是正确性.某个类的行为与 ...

  2. Java并发编程实战---第六章:任务执行

    废话开篇 今天开始学习Java并发编程实战,很多大牛都推荐,所以为了能在并发编程的道路上留下点书本上的知识,所以也就有了这篇博文.今天主要学习的是任务执行章节,主要讲了任务执行定义.Executor. ...

  3. Java多线程编程实战指南(核心篇)读书笔记(三)

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76686044冷血之心的博客) 博主准备恶补一番Java高并发编程相 ...

  4. Java多线程编程实战指南(核心篇)读书笔记(五)

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76730459冷血之心的博客) 博主准备恶补一番Java高并发编程相 ...

  5. Java多线程编程实战指南(核心篇)读书笔记(四)

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76690961冷血之心的博客) 博主准备恶补一番Java高并发编程相 ...

  6. Java多线程编程实战指南(核心篇)读书笔记(二)

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76651408冷血之心的博客) 博主准备恶补一番Java高并发编程相 ...

  7. Java多线程编程实战指南(核心篇)读书笔记(一)

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76422930冷血之心的博客) 博主准备恶补一番Java高并发编程相 ...

  8. Java并发编程实战 第16章 Java内存模型

    什么是内存模型 JMM(Java内存模型)规定了JVM必须遵循一组最小保证,这组保证规定了对变量的写入操作在何时将对其他线程可见. JMM为程序中所有的操作定义了一个偏序关系,称为Happens-Be ...

  9. 【java并发编程实战】第一章笔记

    1.线程安全的定义 当多个线程访问某个类时,不管允许环境采用何种调度方式或者这些线程如何交替执行,这个类都能表现出正确的行为 如果一个类既不包含任何域,也不包含任何对其他类中域的引用.则它一定是无状态 ...

随机推荐

  1. js插件动态加载js、css解决方案

    最近因为工作需要做了一个js自动导入的插件,一开始很天真的以为动态创建个script添加到head中就ok了,试了之后才发现了问题,就是如果同时引入了多个js文件,而且后一个文件中用到了前一个文件中的 ...

  2. ASP.NET MVC轻教程 Step By Step 5——初识表单

    上一节我们将留言列表显示在Index视图里了,现在该添加一个留言的表单,好让用户自己添加留言. 首先在HomeController中添加一个名为“Write”的动作方法. public ActionR ...

  3. bzoj 2049: [Sdoi2008]Cave 洞穴勘测 动态树

    2049: [Sdoi2008]Cave 洞穴勘测 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 3119  Solved: 1399[Submit] ...

  4. <jsp:forward>、requestDispatcher和sendRedirect()的区别

    1.会话信息保存在服务器内存上,可以断续访问,和cookie相比,其保存在服务器上. 2.男人就像蓝牙:只有在你接近时,他才会找上你.当你离开后,他便又去找其他的"设备"了.女人就 ...

  5. 如何搭建一个独立博客——简明Github Pages与Hexo教程

    摘要:这是一篇很详尽的独立博客搭建教程,里面介绍了域名注册.DNS设置.github和Hexo设置等过程,这是我写得最长的一篇教程.我想将我搭建独立博客的过程在一篇文章中尽可能详细地写出来,希望能给后 ...

  6. Prince and Princess

    hdu4685:http://acm.hdu.edu.cn/showproblem.php?pid=4685 题意:有n个王子和m个公主,每个王子都会喜欢若干个公主,也就是王子只跟自己喜欢的公主结婚公 ...

  7. win7电脑自动关机怎么设置

    WIN7系统自带了关机工具的,下面是步骤 1.“开始”-右键点击“计算机”选择“管理”,在左侧界面中选择“任务计划程序”. 2.在右侧界面中选择“创建基本任务”(向导式创建任务,推荐新手使用)或者“创 ...

  8. 第1章 开发环境安装和配置(二)安装JDK、SDK、NDK

    原文 第1章 开发环境安装和配置(二)安装JDK.SDK.NDK 无论是用C#和VS2015开发Androd App还是用Java和Eclipse开发Androd App,都需要先安装JDK和Andr ...

  9. 深入浅出Node.js (附录B) - 调试Node

    B.1 Debugger B.2 Node Inspector B.2.1 安装Node Inspector B.2.2 错误堆栈

  10. Maven学习(3) - Maven和Eclipse集成和构建多模块Maven项目

    最近在工作中越来越经常的用到了Maven作为项目管理和Jar包管理和构建的工具,感觉Maven的确是很好用的.而且要将Maven的功能最大发挥出来,多模块是一个很好的集成例子. 一个Maven项目包括 ...