Java 线程池笔记

本贴最后更新于 2713 天前,其中的信息可能已经事过景迁

线程池

架构:
executor 接口 executors 类
ExecutorService 接口
AbstractExecutorService 抽象类 ScheduledExecutorService 接口
ThreadPoolExecutor 类 ScheduledThreadPoolExecutor 类

Executor 接口
将任务的提交与任务的执行分离
void execute(Runnable command)

ExecutorService 接口(继承 Executor 接口)
为 executor 接口服务
submit
invoke
shutdown

AbstractExecutorService 抽象类(实现 ExecutorService 接口)
继承 ExecutorService 接口,实现该接口的方法

ThreadPoolExecutor 类(继承 ThreadPoolExecutor 类)

//-------------------------------------------------------------------- private final BlockingQueue\<Runnable> workQueue; // 阻塞队列 private final ReentrantLock mainLock = new ReentrantLock(); // 互斥锁,锁住的是线程池 private final HashSet workers = new HashSet(); // 线程集合 private final Condition termination = mainLock.newCondition(); // “终止条件”,与“mainLock”绑定 //-------------------------------------------------------------------- private volatile int corePoolSize; private volatile int maximumPoolSize; private volatile boolean allowCoreThreadTimeOut; // 是否允许线程在空闲状态时,仍然能够存活 private volatile long keepAliveTime; private volatile ThreadFactory threadFactory; private volatile RejectedExecutionHandler handler; // handler是RejectedExecutionHandler类型。它是"线程池拒绝策略"的句柄,也就是说"当某任务添加到线程池中,而线程池拒绝该任务时,线程池会通过handler进行相应的处理 // ThreadPoolExecutor.DiscardPolicy:无法执行的任务将被删除。 // ThreadPoolExecutor.AbortPolicy:默认策略,任务遭到拒绝,直接抛出异常RejectedExecutionException。 // ThreadPoolExecutor.CallerRunsPolicy:让调用者所在的线程来运行该任务。 // ThreadPoolExecutor.DiscardOldestPolicy:将位于阻塞队列头部的任务删除,然后尝试重新执行任务(失败的话重复此过程)。 //-------------------------------------------------------------------- private int largestPoolSize; // 线程池中线程数量曾经达到过的最大值 private long completedTaskCount; // 已完成任务数量 //-------------------------------------------------------------------- // 线程池的生命周期 RUNNING->SHUTDOWN(调用shutdown()方法后)、STOP(调用shutdwonNow()方法后->TIGYING(所有任务已终止)->TERMINATED(调用terminated()方法后) //-------------------------------------------------------------------- // 构造器 ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue\<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) { // threadFactory来自Executors.defaultThreadFactory() } //-------------------------------------------------------------------- // 添加任务到线程池 public void execute(Runnable command) { // 情况1: // 情况2: // 情况3: } // 添加任务到线程池,实际上还是通过调用execute方法 public Future submit(Runnable task) { } // 添加任务到线程池,并创建一个线程启动该任务 // core为true的话,则以corePoolSize为界限,若"线程池中已有任务数量>=corePoolSize",则返回false;core为false的话,则以maximumPoolSize为界限,若"线程池中已有任务数量>=maximumPoolSize",则返回false。 private boolean addWorker(Runnable firstTask, boolean core) { } //-------------------------------------------------------------------- // 关闭线程池 public void shutdown() { } public void shutdownNow() { }

ScheduledExecutorService 接口(继承 Executor 接口)
相当于提供了"延时"和"周期执行"功能的 ExecutorService

ScheduledThreadPoolExecutor 类(实现 ScheduledExecutorService 接口)
ScheduledThreadPoolExecutor

Executors 类
是个静态工厂类。它通过静态工厂方法返回 ExecutorService、ScheduledExecutorService、ThreadFactory 和 Callable 等类的对象。

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

当我们需要获取线程的执行结果时,就需要用到 Callable 和 Future。Callable 用于产生结果(将 Callable 的实现类的对象交给线程池去执行),Future 用于获取结果。

Callable 接口

V call();

Future 接口

V get() throws InterruptedException, ExecutionException; V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException; ....

RunnableFuture(继承了 Future 接口和 Runnable 接口)

public interface RunnableFuture\<V> extends Runnable, Future\<V> { }

FutureTask 类(简介实现 RunnableFuture 接口)

参考:
java.util.concurrrent 包源码
http://www.cnblogs.com/skywang12345/p/java_threads_category.html

  • 线程
    123 引用 • 111 回帖 • 3 关注
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3198 引用 • 8215 回帖 • 1 关注
  • 笔记

    好记性不如烂笔头。

    310 引用 • 794 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • 人工智能

    人工智能(Artificial Intelligence)是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门技术科学。

    163 引用 • 309 回帖
  • Facebook

    Facebook 是一个联系朋友的社交工具。大家可以通过它和朋友、同事、同学以及周围的人保持互动交流,分享无限上传的图片,发布链接和视频,更可以增进对朋友的了解。

    4 引用 • 15 回帖 • 441 关注
  • 30Seconds

    📙 前端知识精选集,包含 HTML、CSS、JavaScript、React、Node、安全等方面,每天仅需 30 秒。

    • 精选常见面试题,帮助您准备下一次面试
    • 精选常见交互,帮助您拥有简洁酷炫的站点
    • 精选有用的 React 片段,帮助你获取最佳实践
    • 精选常见代码集,帮助您提高打码效率
    • 整理前端界的最新资讯,邀您一同探索新世界
    488 引用 • 384 回帖 • 9 关注
  • Jenkins

    Jenkins 是一套开源的持续集成工具。它提供了非常丰富的插件,让构建、部署、自动化集成项目变得简单易用。

    54 引用 • 37 回帖
  • GAE

    Google App Engine(GAE)是 Google 管理的数据中心中用于 WEB 应用程序的开发和托管的平台。2008 年 4 月 发布第一个测试版本。目前支持 Python、Java 和 Go 开发部署。全球已有数十万的开发者在其上开发了众多的应用。

    14 引用 • 42 回帖 • 812 关注
  • 游戏

    沉迷游戏伤身,强撸灰飞烟灭。

    181 引用 • 821 回帖
  • jQuery

    jQuery 是一套跨浏览器的 JavaScript 库,强化 HTML 与 JavaScript 之间的操作。由 John Resig 在 2006 年 1 月的 BarCamp NYC 上释出第一个版本。全球约有 28% 的网站使用 jQuery,是非常受欢迎的 JavaScript 库。

    63 引用 • 134 回帖 • 735 关注
  • MongoDB

    MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是一个基于分布式文件存储的数据库,由 C++ 语言编写。旨在为应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 JSON 的 BSON 格式,因此可以存储比较复杂的数据类型。

    90 引用 • 59 回帖 • 5 关注
  • BND

    BND(Baidu Netdisk Downloader)是一款图形界面的百度网盘不限速下载器,支持 Windows、Linux 和 Mac,详细介绍请看这里

    107 引用 • 1281 回帖 • 35 关注
  • Kubernetes

    Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。

    116 引用 • 54 回帖 • 2 关注
  • 宕机

    宕机,多指一些网站、游戏、网络应用等服务器一种区别于正常运行的状态,也叫“Down 机”、“当机”或“死机”。宕机状态不仅仅是指服务器“挂掉了”、“死机了”状态,也包括服务器假死、停用、关闭等一些原因而导致出现的不能够正常运行的状态。

    13 引用 • 82 回帖 • 75 关注
  • FreeMarker

    FreeMarker 是一款好用且功能强大的 Java 模版引擎。

    23 引用 • 20 回帖 • 461 关注
  • TGIF

    Thank God It's Friday! 感谢老天,总算到星期五啦!

    289 引用 • 4492 回帖 • 656 关注
  • 大数据

    大数据(big data)是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。

    93 引用 • 113 回帖
  • 代码片段

    代码片段分为 CSS 与 JS 两种代码,添加在 [设置 - 外观 - 代码片段] 中,这些代码会在思源笔记加载时自动执行,用于改善笔记的样式或功能。

    用户在该标签下分享代码片段时需在帖子标题前添加 [css] [js] 用于区分代码片段类型。

    146 引用 • 972 回帖
  • WordPress

    WordPress 是一个使用 PHP 语言开发的博客平台,用户可以在支持 PHP 和 MySQL 数据库的服务器上架设自己的博客。也可以把 WordPress 当作一个内容管理系统(CMS)来使用。WordPress 是一个免费的开源项目,在 GNU 通用公共许可证(GPLv2)下授权发布。

    66 引用 • 114 回帖 • 196 关注
  • danl
    165 关注
  • ReactiveX

    ReactiveX 是一个专注于异步编程与控制可观察数据(或者事件)流的 API。它组合了观察者模式,迭代器模式和函数式编程的优秀思想。

    1 引用 • 2 回帖 • 183 关注
  • HTML

    HTML5 是 HTML 下一个的主要修订版本,现在仍处于发展阶段。广义论及 HTML5 时,实际指的是包括 HTML、CSS 和 JavaScript 在内的一套技术组合。

    108 引用 • 295 回帖 • 1 关注
  • Visio
    1 引用 • 2 回帖 • 2 关注
  • Unity

    Unity 是由 Unity Technologies 开发的一个让开发者可以轻松创建诸如 2D、3D 多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

    25 引用 • 7 回帖 • 131 关注
  • 印象笔记
    3 引用 • 16 回帖
  • API

    应用程序编程接口(Application Programming Interface)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

    79 引用 • 431 回帖
  • V2Ray
    1 引用 • 15 回帖
  • CloudFoundry

    Cloud Foundry 是 VMware 推出的业界第一个开源 PaaS 云平台,它支持多种框架、语言、运行时环境、云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的问题。

    5 引用 • 18 回帖 • 177 关注
  • Mac

    Mac 是苹果公司自 1984 年起以“Macintosh”开始开发的个人消费型计算机,如:iMac、Mac mini、Macbook Air、Macbook Pro、Macbook、Mac Pro 等计算机。

    168 引用 • 597 回帖
  • 前端

    前端技术一般分为前端设计和前端开发,前端设计可以理解为网站的视觉设计,前端开发则是网站的前台代码实现,包括 HTML、CSS 以及 JavaScript 等。

    245 引用 • 1338 回帖