`
wbj0110
  • 浏览: 1646350 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

线程池 Executor 以及Executors

    博客分类:
  • Java
阅读更多

Java里面线程池的顶级接口是Executor,但是严格意义上讲Executor并不是一个线程池,而只是一个执行线程的工具。真正的线程池接口是ExecutorService。

下面这张图完整描述了线程池的类体系结构。

Executor-class

首先Executor的execute方法只是执行一个Runnable的任务,当然了从某种角度上将最后的实现类也是在线程中启动此任务的。根据线程池的执行策略最后这个任务可能在新的线程中执行,或者线程池中的某个线程,甚至是调用者线程中执行(相当于直接运行Runnable的run方法)。这点在后面会详细说明。

ExecutorService在Executor的基础上增加了一些方法,其中有两个核心的方法:

  • Future<?> submit(Runnable task)
  • <T> Future<T> submit(Callable<T> task)

这两个方法都是向线程池中提交任务,它们的区别在于Runnable在执行完毕后没有结果,Callable执行完毕后有一个结果。这在多个线程中传递状态和结果是非常有用的。另外他们的相同点在于都返回一个Future对象。Future对象可以阻塞线程直到运行完毕(获取结果,如果有的话),也可以取消任务执行,当然也能够检测任务是否被取消或者是否执行完毕。

在没有Future之前我们检测一个线程是否执行完毕通常使用Thread.join()或者用一个死循环加状态位来描述线程执行完毕。现在有了更好的方法能够阻塞线程,检测任务执行完毕甚至取消执行中或者未开始执行的任务。

 

ScheduledExecutorService描述的功能和Timer/TimerTask类似,解决那些需要任务重复执行的问题。这包括延迟时间一次性执行、延迟时间周期性执行以及固定延迟时间周期性执行等。当然了继承ExecutorService的ScheduledExecutorService拥有ExecutorService的全部特性。

 

ThreadPoolExecutor是ExecutorService的默认实现,其中的配置、策略也是比较复杂的,在后面的章节中会有详细的分析。

ScheduledThreadPoolExecutor是继承ThreadPoolExecutor的ScheduledExecutorService接口实现,周期性任务调度的类实现,在后面的章节中会有详细的分析。

这里需要稍微提一下的是CompletionService接口,它是用于描述顺序获取执行结果的一个线程池包装器。它依赖一个具体的线程池调度,但是能够根据任务的执行先后顺序得到执行结果,这在某些情况下可能提高并发效率。

 

要配置一个线程池是比较复杂的,尤其是对于线程池的原理不是很清楚的情况下,很有可能配置的线程池不是较优的,因此在Executors类里面提供了一些静态工厂,生成一些常用的线程池。

  • newSingleThreadExecutor:创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。
  • newFixedThreadPool:创建固定大小的线程池。每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。
  • newCachedThreadPool:创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程,那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务。此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。
  • newScheduledThreadPool:创建一个大小无限的线程池。此线程池支持定时以及周期性执行任务的需求。
  • newSingleThreadScheduledExecutor:创建一个单线程的线程池。此线程池支持定时以及周期性执行任务的需求。

http://www.blogjava.net/xylz/archive/2010/12/21/341281.html

 

分享到:
评论

相关推荐

    Executor,Executors,ExecutorService比较.docx

    总结来说,`Executor`定义了任务执行的基本行为,`Executors`是创建线程池的工厂,而`ExecutorService`则提供了管理和控制线程池的能力。在实际编程中,我们通常通过`Executors`创建线程池,然后利用`...

    java并发编程:Executor、Executors、ExecutorService.docx

    ExecutorService是Executor的子接口,提供了更丰富的功能,包括生命周期管理、任务调度以及返回Future对象的能力。ExecutorService允许我们优雅地关闭服务,例如通过调用`shutdown()`方法,它会停止接受新的任务并...

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

    Java并发之线程池Executor框架的深入理解 Java中的线程池Executor框架是Java并发编程中的一种常见机制,用于管理和执行异步任务。通过使用线程池,可以大大减少线程的创建和销毁开销,从而提高系统的性能和稳定性。...

    java.线程池与Executor框架(解决方案).md

    Executor框架的主要组件包括Executor接口、ExecutorService接口以及AbstractExecutorService抽象类,而ThreadPoolExecutor是线程池的具体实现类。ThreadPoolExecutor通过配置不同的参数,如核心线程数、最大线程数、...

    java.线程池与Executor框架.md

    首先,我们创建一个线程池的实例,可以通过`java.util.concurrent.Executors`类中的静态方法来创建不同类型的线程池。例如,`newFixedThreadPool(int)`方法用于创建一个具有固定大小的线程池,该线程池中的线程数量...

    线程池与Executor框架(处理方案示例).md

    在Java并发编程中,线程池是管理...Java的Executor框架是一个强大的并发工具,它通过线程池管理以及提供简单易用的API,大大简化了并发程序的开发。开发者可以利用这个框架来构建高效、稳定、可扩展的多线程应用程序。

    java 中Executor, ExecutorService 和 Executors 间的不同

    Java 中的 Executor, ExecutorService 和 Executors 是 Java Executor 框架的重要组件,用于提供线程池的功能。在 Java 1.5 之后,Executor 框架提供了多种内置的线程池,例如 FixedThreadPool 和 CachedThreadPool ...

    使用Java匿名内部类实现一个简单的线程池.txt

    最后通过调用`executor.shutdown()`方法关闭线程池,表示不再接受新的任务,但已经提交的任务将继续执行直到完成。 #### 四、总结 通过上述分析,我们可以看出使用Java匿名内部类实现线程池是一种简洁高效的方法。...

    ThreadPoolExecutor的使用和Android常见的4种线程池使用介绍

    ThreadPoolExecutor的使用和Android常见的4种线程池使用介绍

    线程池管理线程demo

    下面将详细阐述线程池的工作原理、优势以及如何在实际应用中创建和管理线程池。 1. **线程池工作原理** 线程池由一组可重用的线程组成,当有新的任务需要执行时,线程池会从已创建的线程中选择一个空闲线程来执行...

    关于线程池的代码demo

    下面将详细解释线程池的工作原理以及如何通过代码实现一个简单的线程池示例。 线程池的基本工作流程如下: 1. **初始化**: 创建线程池,设置线程数量、任务队列大小等参数。 2. **提交任务**: 当有新的任务需要...

    线程池的实现(JAVA)

    在Java中,`java.util.concurrent` 包提供了对线程池的支持,主要由`ExecutorService`、`ThreadPoolExecutor` 和 `Executors` 类来实现。 1. **ExecutorService**: 这是线程池的核心接口,定义了线程池的主要操作,...

    线程池使用Demo

    线程池是Java并发编程中的重要概念,它是一种线程使用模式,用于高效地管理和执行大量并发任务。...`rxjavademo`这个Demo将帮助你更深入地理解如何在实际项目中运用线程池,以及结合RxJava进行异步编程。

    线程池Thread

    `ExecutorService`是线程池的主要接口,通过`Executors`工厂类可以方便地创建各种类型的线程池。例如: ```java ExecutorService executor = Executors.newFixedThreadPool(10); // 创建固定大小的线程池 executor....

    线程池java

    Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy() // handler ); // 提交任务 for (int i = 0; i ; i++) { final int index = i; executor.submit(new Runnable() { @Override ...

    java线程和线程池的使用.docx

    下面将详细介绍 Java 中线程的创建方式以及线程池的使用。 1. 创建线程的方式: Java 提供了两种主要的创建线程的方式: - **实现 Runnable 接口**:你的类实现 Runnable 接口,并重写 `run()` 方法。然后通过...

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

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

    Java 线程池_动力节点Java学院整理

    在Java 1.5以后,Java内建支持线程池,通过`java.util.concurrent`包中的`Executors`工厂类可以方便地创建线程池实例。 1. `newFixedThreadPool(int nThreads)`:创建一个固定大小的线程池,线程池的大小由传入的`...

    线程池的使用介绍Demo,简单明了。

    ExecutorService executor = Executors.newFixedThreadPool(5); // 创建固定大小的线程池 for (int i = 0; i ; i++) { final int index = i; executor.execute(new Runnable() { @Override public void run() { ...

Global site tag (gtag.js) - Google Analytics