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的一个关键字,它能够将代 ...
随机推荐
- Ubuntu设置root账户密码
创建Ubuntu后是没有root账户的,执行 sudo passwd root 然后系统会提示你输入普通用户的密码.输入后,按回车,然后重复输入两次新的root密码即可激活root用户.
- 编码原则实例------c++程序设计原理与实践(进阶篇)
编码原则: 一般原则 预处理原则 命名和布局原则 类原则 函数和表达式原则 硬实时原则 关键系统原则 (硬实时原则.关键系统原则仅用于硬实时和关键系统程序设计) (严格原则都用一个大写字母R及其编号标 ...
- 题解 P1255 【数楼梯】
题目链接 好吧,承认python 轻松水过 代码奉上: n = int(input()) #定义,输入 a=1 #初始的变量赋值 b=1 n-=1 #我的毒瘤的循环不得不加上这句话 if n > ...
- mysql 远程访问不行解决方法 Host is not allowed to connect to this MySQL server
mysql 远程访问不行解决方法 Host is not allowed to connect to this MySQL server 如果你想连接你的mysql的时候发生这个错误: ERROR 1 ...
- Web 安全入门-书籍及建议
https://www.jianshu.com/p/6dcebd54fb24 (本文源于转载或摘抄整理) 2016-06-12 Fooying 优主张 最近比较忙,灵感稍微有点缺乏,本着宁缺毋滥的想法 ...
- pycharm 不显示代码提示
1.检查是否代码本身有问题. 2.检查代码提示是否成功开启. 3.检查IDE省电模式是否关闭状态. 4.使用快捷键:ctrl+j.ctrl+space.alt+/ 其他(不能安装): 1.检查是否Py ...
- Jenkins持续集成企业实战系列之Jenkins配置演示-----03
注:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任. 最初接触Jenkins也是由于公司需求,根据公司需求Java代码项目升级的.(公司是 ...
- 【离散数学】 SDUT OJ 谁是作案嫌疑人?
谁是作案嫌疑人? Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Problem Description 刑侦大队对涉及六个嫌 ...
- easyui datagrid可编辑表格使用经验分享
文章目录 1相关接口方法 2列属性formatter 3编辑器类型 3.1基于my97的编辑器 3.2简单的密码编辑器 3.3动态增加/删除编辑器 4字段的级联操作 4.1combobox的级联操作 ...
- minizip -基于zlib开源代码库
转载:https://www.topomel.com/archives/979.html 一.minizip 是一套用来压缩和解压文件的工具,其基于zlib开源代码库. 开源代码下载链接:http:/ ...
