java并发编程 - Exexctor简介
Exexctor 常用类关系图
Executor 接口
Excutor 接口定义如下
ExecutorService
ExecutorService 是一个比 Executor 使用更广泛的子类接口,其提供了生命周期管理的方法,以及可跟踪一个或多个异步任务执行状况返回Future的方法
AbstractExecutorService
ExecutorService执行方法的默认实现
ScheduledExecutorService
一个可定时调度任务的接口
ScheduledThreadPoolExecutor
ScheduledExecutorService的实现,一个可定时调度任务的线程池
ScheduledExecutorService 的一个构造函数如下
ThreadPoolExecutor
线程池,可以通过调用Executors 的静态工厂方法来创建线程池并返回一个 ExecutorService 对象
ThreadPoolExecutor 的一个构造函数如下
参数说明
corePoolSize:核心线程数,如果运行的线程少于corePoolSize,则创建新线程来执行新任务,即使线程池中的其他线程是空闲的
maximumPoolSize:最大线程数,可允许创建的线程数,
corePoolSize 和 maximumPoolSize 设置的边界自动调整池大小:
- corePoolSize < 运行的线程数 < maximumPoolSize :仅当队列满时才创建新线程
- corePoolSize = 运行的线程数 = maximumPoolSize :创建固定大小的线程池
keepAliveTime :如果线程数多于 corePoolSize ,则这些多余的线程的空闲时间超过keepAliveTime时将被终止
unit :keepAliveTime参数的时间单位
workQueue :保存任务的阻塞队列,与线程池的大小有关:
- 运行的线程数 < corePoolSize 时,在有新任务时直接创建新线程来执行任务而无需再进队列
- 运行的线程数 >= corePoolSize 时,在有新任务添加时则选加入队列,不直接创建线程
- 当队列满时,在有新任务时就创建新线程
threadFactory :使用 ThreadFactory 创建新线程,默认使用 defaultThreadFactory 创建线程
handle :定义处理被拒绝任务的策略,默认使用 ThreadPoolExecutor.AbortPolicy,任务被拒绝时将抛出 RejectExecutorException
Executor的生命周期
ExecutorService 提供了管理 Eecuto r生命周期的方法,ExecutorService的生命周期包括了:运行 关闭和终止三种状态。
ExecutorService 在初始化创建时处于运行状态。
ExecutorCompletionService
实现了CompletionService,它将 BlockingQueue 和 Executor 封装起来。然后使用 ExecutorCompletionService.submit() 方法提交任务。
public Future<V> submit(Callable<V> task) {
if (task == null) throw new NullPointerException(); // RunnableFuture封装了任务,使得任务既能run 也能get()
RunnableFuture<V> f = newTaskFor(task);
// 使用一个继承Runnable类的QueueingFutue 再次封装了我们的任务
executor.execute(new QueueingFuture(f));
return f;
}
QueueingFuture:
private class QueueingFuture extends FutureTask<Void> {
QueueingFuture(RunnableFuture<V> task) {
super(task, null);
this.task = task;
}
// 实现了FutureTask 的done 方法,在任务处理完毕或者抛异常后将封装成Future的任务加入到队列。这样我们就能在队列中取到处处理完的任务,并通过Future.get()方法去取得处理完后的结果。不用自己去判断任务是否处理完毕了
protected void done() { completionQueue.add(task); }
private final Future<V> task;
}
实例:
// 启动10条线程,谁先执行完成就返回谁
ExecutorService executor = Executors.newFixedThreadPool(10); //创建含10.条线程的线程池
CompletionService service = new ExecutorCompletionService(executor);
for (int i = 1; i <= 10; i++)
{
final int result = i;
service.submit(new Callable<String>()
{
public String call() throws Exception
{
Thread.sleep(new Random().nextInt(5000)); //让当前线程随机休眠一段时间
return "task done " + result;
}
});
}
System.out.println(service.take().get()); //获取执行结果
java并发编程 - Exexctor简介的更多相关文章
- 《Java并发编程实战》读书笔记一 -- 简介
<Java并发编程实战>读书笔记一 -- 简介 并发的历史 并发的历史,也是人类利用有限的资源去提高生产效率的一个的例子. 设想现在有台计算机,这台计算机具有以下的资源: 单核CPU一个 ...
- java并发编程笔记(一)——并发编程简介
java并发编程笔记(一)--简介 线程不安全的类示例 public class CountExample1 { // 请求总数 public static int clientTotal = 500 ...
- 【Java并发编程实战】-----“J.U.C”:ReentrantLock之一简介
注:由于要介绍ReentrantLock的东西太多了,免得各位客官看累,所以分三篇博客来阐述.本篇博客介绍ReentrantLock基本内容,后两篇博客从源码级别分别阐述ReentrantLock的l ...
- (转)java并发编程--Executor框架
本文转自https://www.cnblogs.com/MOBIN/p/5436482.html java并发编程--Executor框架 只要用到线程,就可以使用executor.,在开发中如果需要 ...
- 【Java并发编程实战】-----“J.U.C”:Semaphore
信号量Semaphore是一个控制访问多个共享资源的计数器,它本质上是一个"共享锁". Java并发提供了两种加锁模式:共享锁和独占锁.前面LZ介绍的ReentrantLock就是 ...
- 《Java并发编程实战》/童云兰译【PDF】下载
<Java并发编程实战>/童云兰译[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230062521 内容简介 本书深入浅出地介绍了Jav ...
- Java并发编程的艺术读书笔记(2)-并发编程模型
title: Java并发编程的艺术读书笔记(2)-并发编程模型 date: 2017-05-05 23:37:20 tags: ['多线程','并发'] categories: 读书笔记 --- 1 ...
- Java并发编程——BlockingQueue
简介 BlockingQueue很好的解决了多线程中,如何高效安全"传输"数据的问题.通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利. 阻塞队列是 ...
- Java并发编程(十一)-- Java中的锁详解
上一章我们已经简要的介绍了Java中的一些锁,本章我们就详细的来说说这些锁. synchronized锁 synchronized锁是什么? synchronized是Java的一个关键字,它能够将代 ...
随机推荐
- [.net 多线程]ThreadPool的安全机制
ThreadPool类,有两个方法我们没有用到,UnsafeQueueUserWorkItem 和UnsafeRegisterWaitForSingleObject. 为了完全理解这些方法,首先,我们 ...
- .Net Core .Net Core的学习
.Net Core 学习 一.什么是.net core? 百度百科: https://baike.baidu.com/item/.net%20core/20130686?fr=aladdin 个人总结 ...
- css清除浮动的8种方法以及优缺点
浮动会使当前标签产生上浮的效果,同时会影响到前后的标签.父级标签的位置及width height 属性.而且同样的代码,在各种浏览器中效果可能不同,这样让清除浮动更难了.清除浮动引起的问题有很多的方法 ...
- MyBatis与Hibernate比较
MyBatis: 1.是一个sql语句映射的框架(工具). 2.注重pojo与sql之间的映射关系.不会为程序员在运行期自动生成sql 3.自动化程度低,手工映射sql灵活程度高 4.需要开发人员熟练 ...
- Java中的Random()函数-----转载
Java中的Random()函数 (2013-01-24 21:01:04) 转载▼ 标签: java random 随机函数 杂谈 分类: Java 今天在做Java练习的时候注意到了Java里面的 ...
- 自动判断PC端、手机端跳往不同的域名JS实现代码
输入相同域名,在pc端和移动端会出现不同的页面效果,一种是用栅格系统实现自适应, 更多的是设计两套不同的模板和两个二级域名或者一个主域名和一个二级域名(就是有区别就可以了); js代码判断浏览器的用户 ...
- linux opencv版本查询
查看opencv安装路径: sudo find / -iname "*opencv*" 查看opencv版本: pkg-config opencv --modversion 查看o ...
- 黑马学习CSS之CSS模块化规范全部组成 CSS属性列表
- angularJs表格效果
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <script sr ...
- Spring学习笔记(六)—— SSH整合
一.整合原理 二.整合步骤 2.1 导包 [hibernate] hibernate/lib/required hibernate/lib/jpa 数据库驱动 [struts2] struts-bla ...