`
wangwengcn
  • 浏览: 173360 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Executor框架(线程池)

阅读更多

Executor基于生产者-消费者模式,提交任务(Runnable)的操作相当于生产者(生成待完成的工作单元),执行任务的线程相当于消费者(执行完这些工作单元)。
每当看到下面这种形式的代码时:

new Thread(runnable).start()

并且你希望获得一种更灵活的执行策略,请考虑使用Executor来替代Thread。

 

 

1. 线程池

在线程池中执行任务比为每个任务分配一个线程优势更多。通过重用现有的线程而不是创建新线程,可以在处理多个请求时分摊在线程创建和销毁过程中产生的巨大开销。另一个额外的好处是:当请求到达时,工作线程通常已经存在,因此不会由于等待创建线程而延迟任务的执行,从而提高了响应性。通过适当调整线程池的大小,可以创建足够多的线程以便使处理器保持忙碌状态,同时还可以防止过多线程相互竞争资源而使应用程序耗尽内存或者失败。
API提供了一个灵活的线程池以及一些有用的默认配置。可以通过调用Executors中的静态工厂方法之一来创建线程池:

  • newFixedThreadPool将创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程。在任意点,在大多数 nThreads 线程会处于处理任务的活动状态。如果在所有线程处于活动状态时提交附加任务,则在有可用线程之前,附加任务将在队列中等待。如果在关闭前的执行期间由于失败而导致任何线程终止,那么一个新线程将代替它执行后续的任务(如果需要)。在某个线程被显式地关闭之前,池中的线程将一直存在。
  • newCachedThreadPool将创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们,线程池的规模不存在任何限制。对于执行很多短期异步任务的程序而言,这些线程池通常可提高程序性能。调用 execute 将重用以前构造的线程(如果线程可用)。如果现有线程没有可用的,则创建一个新线程并添加到池中。终止并从缓存中移除那些已有 60 秒钟未被使用的线程。因此,长时间保持空闲的线程池不会使用任何资源。注意,可以使用 ThreadPoolExecutor 构造方法创建具有类似属性但细节不同(例如超时参数)的线程池。
  • newSingleThreadExecutor将会创建一个单线程的Executor,它创建单个工作者线程来执行任务,如果这个线程异常结束,会创建另一个线程来替代。newSingleThreadExecutor能确保依照任务在队列中的顺序来串行执行(例如FIFO/LIFO/优先级)
  • newScheduledThreadPool创建ScheduledExecutorService,它是一个固定长度的线程池,而且以延迟或定时的方式来执行任务,类似于Timer。

2. 任务执行完通知(CompletionService)

CompletionService接口用于执行多个任务,通过阻塞的take方法获得已经完成的任务(当任务完成就将对应的Future放入到一个阻塞队列中)。构造函数需要传入一个Executor。
将生产新的异步任务与使用已完成任务的结果分离开来的服务。生产者submit执行的任务。使用者take已完成的任务,并按照完成这些任务的顺序处理它们的结果。例如,CompletionService可以用来管理异步IO,执行读操作的任务作为程序或系统的一部分提交,然后,当完成读操作时,会在程序的不同部分执行其他操作,执行操作的顺序可能与所请求的顺序不同。通常,CompletionService依赖于一个单独的Executor来实际执行任务,在这种情况下,CompletionService只管理一个内部完成队列。ExecutorCompletionService类提供了此方法的一个实现。
内存一致性效果:线程中向 CompletionService 提交任务之前的操作 happen-before 该任务执行的操作,后者依次 happen-before 紧跟在从对应 take() 成功返回的操作。

 

3. 预定时间内执行多个任务

创建N个任务,将其提交到一个线程池,保留N个Future,并使用限时的get方法通过Future串行地获取每一个结果,完成这样的任务还有另一个更简单的方法-invokeAll
Please refer to API of ExecutorService。

分享到:
评论

相关推荐

    架构师知识体系.pdf

    目 录;卷首语;目录;热点 | Hot;Node.js 与 io.js 那些事儿;深入解析和反思携程宕机事件;推荐文章|Article序列化和反序列; 高;可用可伸缩架构实用经验谈;...戏(细)说 Executor 框架线程池任务执行全过程(下)

    Java基础篇:Executor框架.pdf

    该文档详细记录了Executor框架结构、使用示意图、ThreadPoolExecutor使用示例、线程池原理分析、几种常见线程池(FixedThreadPool、SingleThreadExecutor、CachedThreadPool)的详解以及线程池大小确定等内容

    线程池之Executor框架.docx

    Executor框架主要由3部分组成: 任务 。包括被执行任务需要实现的接口:Runnable接口或者Callable接口。 任务的执行 。包括任务执行机制的核心接口Executor,以及继承自Executor的ExecutorService接口。...

    针对于Executor框架,Java API,线程共享数据

    Executor框架是Java并发编程中的一个重要工具,它提供了一种管理线程池的方式,使得我们可以更方便地管理线程的生命周期和执行线程任务。 原子操作是指不可被中断的操作,要么全部执行成功,要么全部不执行。原子...

    Java并发之线程池Executor框架的深入理解

    主要介绍了Java并发之线程池Executor框架的深入理解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    Java并发Executor框架

    1、Executor框架简介  从JDK5开始,工作单元和执行机制隔离开来,工作单元包括Runnable和Callable,执行机制由Executor提供。  调用关系:Java线程一对一映射到本地操作系统的系统线程,当多线程程序分解若干...

    Java中的Runnable接口最全讲义

    8.2 使用Executor框架创建线程池 8.3 线程池的优势和适用场景 9. 线程中断: 9.1 如何中断线程 9.2 处理中断请求 10. 线程状态: 10.1 线程的生命周期 10.2 如何获取线程状态 11. 线程异常处理: ......

    Java-Executor并发框架.docx

    Java是天生就支持并发的语言,支持并发意味着多线程,线程的频繁创建在高并发及大数据量是非常消耗资源的,因为java提供了线程池。这篇文章主要介绍下并发包下的Executor接口,Executor接口虽然作为一个非常旧的接口...

    java线程池ThreadPoolExecutor类使用详解.docx

    而线程池不允许使用Executors去创建,而要通过ThreadPoolExecutor方式,这一方面是由于jdk中Executor框架虽然提供了如newFixedThreadPool()、newSingleThreadExecutor()、newCachedThreadPool()等创建线程池的方法,...

    什么是线程?Java中如何创建和管理线程?(java面试题附答案).txt

    通过将 MyRunnable 对象传递给 Thread 类...Executor 框架和线程池:用于管理和调度线程的执行。 通过合理地创建和管理线程,我们可以实现复杂的并发执行逻辑,提高程序的性能和响应能力,并确保线程之间的安全和协调。

    Java 线程池框架核心代码分析1

    前言多线程编程中,为每个任务分配一个线程是不现实的,线程创建的开销和资源消耗都是很高的。线程池应运而生,成为我们管理线程的利器。Java 通过 Executor

    Java线程池框架核心代码分析

     下面,我们来分析一下 Java 线程池框架的实现ThreadPoolExecutor。  下面的分析基于JDK1.7  生命周期  ThreadPoolExecutor中,使用CAPACITY的高3位来表示运行状态,分别是:  RUNNING:接收新任务,并且...

    多线程了解

    java多线程、线程池详细教程,Executor框架的简单介绍。

    Java面试问题带答案40道.docx

    另外,还可以使用Executor框架或线程池来管理线程。 3. Java中什么是抽象类? 答:抽象类是一种不能被实例化的类,只能作为其他类的基类。它可以包含抽象方法,用于定义子类必须实现的方法。 4. Java中什么是接口...

    多线程系列相关的技术要点

    1. Java多线程学习(一)Java多线程入门 2. Java多线程学习(二)synchronized关键字(1) 3. Java多线程学习(二)synchronized关键字(2) 4. Java多线程学习(三...9. Java多线程学习(八)线程池与Executor 框架

    上海某大厂java面试真题与解析

    3、"深入理解线程池工作原理,掌握Executor框架下四种线程池的创建与应用,有效提升系统资源利用率。#Java线程池 #性能优化" 4、"线程状态流转图解析,从New到Runnable,再到Running,直至Blocked或Dead,全面解析...

    免费超全面的Java基础类型,容器,并发,IO流,面向对象,Web编程等代码总结

    Executor线程池框架简介 面向对象 泛型机制与反射原理 Proxy动态代理机制详解 从整体上观察对象 网络开发 Servlet基础,生命周期执行过程 Http请求详解,握手挥手流程简介 会话跟踪技术,Session和Cookie详解 过滤...

    ArtConcurrentBook.rar

    《Java并发编程的艺术》内容涵盖Java并发编程机制的底层实现原理、Java内存模型、Java并发编程基础、Java中的锁、并发容器和框架、原子类、并发工具类、线程池、Executor框架等主题,每个主题都做了深入的讲解,同时...

    《Java并发编程的艺术》

    《Java并发编程的艺术》内容涵盖Java并发编程机制的底层实现原理、Java内存模型、Java并发编程基础、Java中的锁、并发容器和框架、原子类、并发工具类、线程池、Executor框架等主题,每个主题都做了深入的讲解,同时...

    Java并发编程的艺术

    , 《Java并发编程的艺术》内容涵盖Java并发编程机制的底层实现原理、Java内存模型、Java并发编程基础、Java中的锁、并发容器和框架、原子类、并发工具类、线程池、Executor框架等主题,每个主题都做了深入的讲解,...

Global site tag (gtag.js) - Google Analytics