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 在初始化创建时处于运行状态。

 - shutdown 方法等待提交的任务执行完成并不再接受新任务,在完成全部提交的任务后关闭
 - shutdownNow 方法将强制终止所有运行中的任务并不再允许提交新任务
 

ExecutorCompletionService

实现了CompletionService,它将 BlockingQueue 和 Executor 封装起来。然后使用 ExecutorCompletionService.submit() 方法提交任务。

将执行完成的任务放到阻塞队列中,通过 take 或 poll 方法来获得执行结果。
 
 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简介的更多相关文章

  1. 《Java并发编程实战》读书笔记一 -- 简介

    <Java并发编程实战>读书笔记一 -- 简介 并发的历史 并发的历史,也是人类利用有限的资源去提高生产效率的一个的例子. 设想现在有台计算机,这台计算机具有以下的资源: 单核CPU一个 ...

  2. java并发编程笔记(一)——并发编程简介

    java并发编程笔记(一)--简介 线程不安全的类示例 public class CountExample1 { // 请求总数 public static int clientTotal = 500 ...

  3. 【Java并发编程实战】-----“J.U.C”:ReentrantLock之一简介

    注:由于要介绍ReentrantLock的东西太多了,免得各位客官看累,所以分三篇博客来阐述.本篇博客介绍ReentrantLock基本内容,后两篇博客从源码级别分别阐述ReentrantLock的l ...

  4. (转)java并发编程--Executor框架

    本文转自https://www.cnblogs.com/MOBIN/p/5436482.html java并发编程--Executor框架 只要用到线程,就可以使用executor.,在开发中如果需要 ...

  5. 【Java并发编程实战】-----“J.U.C”:Semaphore

    信号量Semaphore是一个控制访问多个共享资源的计数器,它本质上是一个"共享锁". Java并发提供了两种加锁模式:共享锁和独占锁.前面LZ介绍的ReentrantLock就是 ...

  6. 《Java并发编程实战》/童云兰译【PDF】下载

    <Java并发编程实战>/童云兰译[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230062521 内容简介 本书深入浅出地介绍了Jav ...

  7. Java并发编程的艺术读书笔记(2)-并发编程模型

    title: Java并发编程的艺术读书笔记(2)-并发编程模型 date: 2017-05-05 23:37:20 tags: ['多线程','并发'] categories: 读书笔记 --- 1 ...

  8. Java并发编程——BlockingQueue

    简介 BlockingQueue很好的解决了多线程中,如何高效安全"传输"数据的问题.通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利. 阻塞队列是 ...

  9. Java并发编程(十一)-- Java中的锁详解

    上一章我们已经简要的介绍了Java中的一些锁,本章我们就详细的来说说这些锁. synchronized锁 synchronized锁是什么? synchronized是Java的一个关键字,它能够将代 ...

随机推荐

  1. NPOI row.Cells[i] 的坑

    我有A行B列的EXCEL表格: 获取一行数据: IRow row=sheet.GetRow(i); 正常是这样的 row.Cells.Count = B; 但由于会存在没有激活的单元格,导致 row. ...

  2. C# 向TIM或者QQ自动发送中文消息【微信也是可用的】 附测试GIF

    之前用C++简单的写了一个demo 现在用C#写了完整版 定义字符 定义发送数量 定义发送对象 注意事项 QQ必须单独一个窗体 微信对象在输入名字的时候必须写微信 源代码 using System; ...

  3. php代码审计5审计命令执行漏洞

    命令执行漏洞:通过易受攻击的应用程序在主机操作系统上执行任意命令,用户提供的数据(表单,cookie,http头等)未过滤 挖掘思路:用户能够控制函数输入,存在可执行代码的危险函数 命令执行和代码执行 ...

  4. C# Winform中自定义筛选及自带统计行的Datagridview控件

    网上分享有很多种自制DGV控件,都有不小的缺陷. 没办法,按需求自己定制了一个. 一.过滤方面类似于Excel的筛选功能.支持右键菜单筛选,同时也支持在文本框输入文字按焦点列进行筛选: 二.统计行我采 ...

  5. Docker Community Edition 镜像使用帮助

    1.什么是Docker 容器技术 在计算机的世界中,容器拥有一段漫长且传奇的历史.容器与管理程序虚拟化 (hypervisor virtualization,HV)有所不同,管理程序虚拟化通过中间层将 ...

  6. CI框架部署后访问出现404

    昨天新配置了一个PHP集成开发环境,安装完后,把项目放到Apache服务器的www目录下,发现只能打开首页,其他页面全部无法打开,当时比较纳闷,以为是服务器没有配置好,测试了一下,发现环境配置没有问题 ...

  7. requests库和urllib包对比

    python中有多种库可以用来处理http请求,比如python的原生库:urllib包.requests类库.urllib和urllib2是相互独立的模块,python3.0以上把urllib和ur ...

  8. Difference **面向过程(或者叫结构化)分析方法**面向对象分析方法

    面向过程和面向对象的区别 面向过程是分析出解决问题所需要的步骤,然后一步步实现,面向对象是把构成问事件分解成各个对象,建立对象的目的是为了描述某个事物在整个解决问题的步骤中的行为. 可以说面向对象是从 ...

  9. vue 利用 v-model 实现 双向传递数据..

    注意 <input type='hidden' :value='value'/> 变量名必须 是 value--- 不能叫其他名字++

  10. MySql 碎片

    查看某个表所占空间,以及碎片大小. select table_name,engine,table_rows,data_length+index_length length,DATA_FREE from ...