Executor框架简介

从JDK5开始,把工作单元和执行机制分离开来了,工作的单元包括Runnable和Callable,执行机制就是由Executor框架提供。

Executor两级调度模型

HotSpot虚拟机将Java线程映射为操作系统的线程。

在上层,Java多线程程序将应用分解为多个任务,然后由用户级的调度器Executor将这些任务映射为固定数量的线程。

在底层,操作系统将这些线程映射到硬件处理器上。

Executor结构与成员

结构由三大部分组成:

  • 任务:包括被执行任务所需要实现的接口:Runnable, Callable。
  • 任务的执行:核心接口时Executor,以及继承了它的ExecutorService接口。ExecutorService有两个关键类,ThreadPoolExecutor和ScheduledThreadPoolExecutor。
  • 执行结果:包括Future接口及其实现类FutureTask。

线程池相关

1.FixedThreadPool

代码实现

public static ExecutorService newFixedThreadPool(int nThreads){
return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
}

这里把keepAliveTime设置为0L,超过核心数的多余的线程会立即停止。

特点

  1. 线程数固定。
  2. corePoolSize和maximunPoolSize都为用户设定的线程数量nThreads,则超出无法创建超出核心数量的工作线程。
  3. 堵塞队列采用LinkedBlockingQueue,无界队列。
  4. 采用无界队列,就不会拒绝任务,同时maximumPoolSize和keepAliveTime参数将无效。

2.SingleThreadPool

使用方法

public static ExecutorService newSingleThreadExecutor(){
return new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
}

特点

  1. 只有一条工作线程。
  2. 采用阻塞队列为LinkedBlockingQueue。

3.CachedThreadPool

代码实现

public static ExecutorService newCachedThreadPool(){
return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.MILLISECONDS, new SynchronousQueue<Runnable>());
}

特点

  1. 可以无限扩大。
  2. 适合处理执行时间小任务。
  3. 核心线程数为0,而最大线程数无限大,这样线程数量可以无限扩大。
  4. 超时时间时60s,这样空闲线程等待60秒后就会被销毁。
  5. 阻塞队列采用SynchronousQueue。这个队列没有存储空间,所以,如果有任务到来,就不会被入队,直接新建线程拿去运行。

4.ScheduledThreadPool

特点

  1. 用于执行延时或者定时任务
  2. 采用DelayQueue阻塞队列,内部其实由PriorityQueue实现,并根据时间排序,时间相同则根据序号排序,也是无界队列。
  3. 需要确定任务开始时间,任务序列号,任务执行的时间间隔。
  4. 如果是周期任务,则执行完又放回队列。

Java并发编程的艺术(十一)——Executor与线程池的更多相关文章

  1. Java并发编程的艺术(十一)——线程池(2)

    Executor两级调度模型 在HotSpot虚拟机中,Java中的线程将会被一一映射为操作系统的线程. 在Java虚拟机层面,用户将多个任务提交给Executor框架,Executor负责分配线程执 ...

  2. Java并发编程(三)什么是线程池

    什么是线程池 学习编程的小伙伴们会经常听到“线程池”.“连接池”这类的词语,可是到底“池”是什么意思呢?我讲个故事大家就理解了:在很久很久以前有一家银行,一年之中只有一个客户来办理业务,随着时间的推移 ...

  3. Java并发编程(八):线程调度——线程池

    new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? new Thread(new Runnable() { @Override public void run() { / ...

  4. 【java并发编程实战】第八章:线程池的使用

    1.线程饥饿锁 定义:在线程池中,如果任务的执行依赖其他任务,那么可能会产生线程饥饿锁.尤其是单线程线程池. 示例: public class ThreadDeadStarveTest { publi ...

  5. Java并发编程的艺术(七)——线程间的通信

    为什么需要线程间通信 让线程之间合作,提高运行效率. volatile和synchronized关键字 实现原理 这两个方式都是采用共享内存的方式进行通信,通过同步机制保证数据可见性和排他性. 特点 ...

  6. Java并发编程的艺术(五)——线程和线程的状态

    线程 什么是线程 操作系统调度的最小单元就是线程,也叫轻量级进程. 为什么要使用多线程 多线程程序能够更有效率地利用多处理器核心. 用户响应时间更快. 方便程序员将程序模型映射到Java提供的多线程编 ...

  7. 那些年读过的书《Java并发编程实战》和《Java并发编程的艺术》三、任务执行框架—Executor框架小结

    <Java并发编程实战>和<Java并发编程的艺术>           Executor框架小结 1.在线程中如何执行任务 (1)任务执行目标: 在正常负载情况下,服务器应用 ...

  8. 读《Java并发编程的艺术》(一)

    离开博客园很久了,自从找到工作,到现在基本没有再写过博客了.在大学培养起来的写博客的习惯在慢慢的消失殆尽,感觉汗颜.所以现在要开始重新培养起这个习惯,定期写博客不仅是对自己学习知识的一种沉淀,更是在督 ...

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

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

随机推荐

  1. //*[starts-with(@class,'btn')][text()='差'] 正则定位元素

    starts-with?  //*[starts-with(@class,'btn')][text()='差']   意思找从头开始的这个class

  2. Docker学习第三天(Docker数据卷管理)

    1.Docker数据卷管理 在Docker中,要想实现数据的持久化(所谓Docker的数据持久化即数据不随着Container的结束而结束),需要将数据从宿主机挂载到容器中.目前Docker提供了三种 ...

  3. 【深度分析】:阿里,腾讯面试题 SpringBoot整合Spring MVC

    Java学习总结 SpringBoot整合Spring MVC 1.SpringMVC概述 MVC(Model–view–controller)是软件工程中的一种软件架构模式,基于此模式把软件系统分为 ...

  4. MathType中的条件概率的输入

    条件概率公式是高中数学的概率知识中比较常用的一个公式,今天我们来介绍一下在MathType中如何输入条件概率公式. 具体步骤如下: 步骤一 打开专业的公式编辑软件MathType 7,在输入框中输入& ...

  5. 使用iMindMap思维导图软件的活动策划模板制定策划方案

    活动策划不单单是一个头脑风暴的过程,更是一个整合各项资源.条件的过程.因此我们可以合理的使用思维导图软件来做活动策划.iMindMap(Windows系统)思维导图软件提供了快捷而方便的活动策划模板, ...

  6. LeetCode周赛#206

    1583. 统计不开心的朋友 #模拟 #暴力 题目链接 题意 有n为朋友,对每位朋友i,preference[i]包含 按亲密度从大到小 的朋友编号. 朋友们会被分为若干对,配对情况由pairs数组给 ...

  7. 关于C语言编程的高效学习方法,首要任务是掌握高效编程,其次乃代码优化!

    在本篇文章中,我收集了很多经验和方法.应用这些经验和方法,可以帮助我们从执行速度和内存使用等方面来优化C语言代码. 简介 在最近的一个项目中,我们需要开发一个运行在移动设备上但不保证图像高质量的轻量级 ...

  8. 「考试」CSP-S 2020

    乱扯 爆炸的过程是这样的 写了\(2.5h\)的\(T1\)过不去大样例,自闭了 决定调\(T2\)然后过了样例但事实上写的完全是假的 这个时候突然\(T1\)灵光一闪就没再看\(T2\)了 然后就一 ...

  9. Alpha冲刺——代码规范,冲刺计划

    这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzzcxy/2018SE2/ 这个作业要求在哪里 https://edu.cnblogs.com/campus/f ...

  10. python将对象写入文件,以及从文件中读取对象

    原文地址: http://www.voidcn.com/article/p-fqtqpwxp-wo.html 写入文件代码: >>> import sys, shelve >& ...