了解java并发编程核心框架Executor

目录

Executor框架简介

Executor框架的结构

如何使用Excutor框架?

Excutor框架的成员


本文摘自java并发编程的艺术(本文摘出来用于本人学习)

Java 中,使用 线 程来异步 行任 Java 线 程的 建与 需要一定的开 ,如果我
每一个任 务创 建一个新 线 程来 行, 线 程的 建与 将消耗大量的 源。同
每一个任 务创 建一个新 线 程来 行, 种策略可能会使 于高 荷状 用最
Java线程既是工作元,也是行机制。
JDK 5 开始,把工作 元与 行机制分离开
来。工作 元包括 Runnable Callable ,而 行机制由Executor框架提供

Executor框架简介

HotSpot VM 线程模型中, Java 线 程( java.lang.Thread )被一 一映射 本地操作系 统线
程。 Java 线 程启 动时 建一个本地操作系 统线 程;当 Java 线 个操作系 统线
也会被回收。操作系 度所有 线 程并将它 分配 可用的 CPU
在上 Java 线程程序通常把用分解若干个任 然后使用用 户级度器
Executor框架)将些任映射固定数量的线 在底 ,操作系内核将线程映射到
硬件理器上

Executor框架的结构

Executor框架主要由3大部分成如下。

  • · 。包括被 行任 需要 实现 的接口: Runnable 接口或 Callable 接口。
  • 行。包括任 务执 行机制的核心接口 Executor ,以及 承自 Executor
    ExecutorService 接口。 Executor 框架有两个关 键类实现 ExecutorService 接口
    ThreadPoolExecutor ScheduledThreadPoolExecutor )。
  • ·异步算的果。包括接口Future实现Future接口的FutureTask 
Executor 是一个接口,它是 Executor 框架的基 ,它将任 的提交与任 行分离开
来。
  • ·ThreadPoolExecutor线程池的核心实现类,用来行被提交的任
  • ScheduledThreadPoolExecutor是一个实现类,可以在定的延后运行命令,或者定期行命令。ScheduledThreadPoolExecutorTimer更灵活,功能更大。 ·Future接口和实现
  • Future接口的FutureTask,代表异步算的果。
  • Runnable接口和Callable接口的实现类,都可以被ThreadPoolExecutorScheduled- ThreadPoolExecutor行。

如何使用Excutor框架?

线 程首先要 实现 Runnable 或者 Callable 接口的任 务对 象。工具 Executors 可以把一
Runnable 象封装 一个 Callable 象( Executors.callable Runnable task )或
Executors.callable Runnable task Object resule ))。
然后可以把 Runnable 象直接交 ExecutorService 行( ExecutorService.execute Runnable
command ));或者也可以把 Runnable 象或 Callable 象提交 ExecutorService 行( Executor-Service.submit Runnable task )或 ExecutorService.submit Callable<T>task ))。
如果 ExecutorService.submit ), ExecutorService 将返回一个 实现 Future 接口的
(到目前 止的 JDK 中,返回的是 FutureTask 象)。由于 FutureTask 实现 Runnable ,程序 也可 FutureTask ,然后直接交 ExecutorService 行。
最后,主 线 程可以 FutureTask.get() 方法来等待任 务执 行完成。主 线 程也可以 FutureTask.cancel boolean mayInterruptIfRunning )来取消此任 行。

Excutor框架的成员

Executor 框架的主要成 ThreadPoolExecutor ScheduledThreadPoolExecutor
Future 接口、 Runnable 接口、 Callable 接口和 Executors
1 ThreadPoolExecutor
ThreadPoolExecutor 通常使用工厂 Executors 建。 Executors 可以 3 型的
ThreadPoolExecutor:SingleThreadExecutor、FixedThreadPool和CachedThreadPool。
1 FixedThreadPool 。下面是 Executors 提供的, 建使用固定 线 程数的 FixedThreadPool
API
public static ExecutorService newFixedThreadPool(int nThreads)
public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactorythreadFacto
FixedThreadPool 适用于 源管理的需求,而需要限制当前 线 程数量的
景,它适用于 负载 重的服 器。
2) SingleThreadExecutor 。下面是 Executors 提供的, 建使用 线 程的 SingleThread-
Executor API
public static ExecutorService newSingleThreadExecutor()
public static ExecutorService newSingleThreadExecutor(ThreadFactory threadFactory)
SingleThreadExecutor 适用于需要保 证顺 序地 行各个任 ;并且在任意 时间 点,不会有多
线 程是活 景。
3 CachedThreadPool 。下面是 Executors 提供的, 建一个会根据需要 建新 线 程的
CachedThreadPool API
public static ExecutorService newCachedThreadPool()
public static ExecutorService newCachedThreadPool(ThreadFactory threadFactory)
CachedThreadPool 是大小无界的 线 程池,适用于 行很多的短期异步任 的小程序,或者
负载较轻 的服 器。
2 ScheduledThreadPoolExecutor
ScheduledThreadPoolExecutor 通常使用工厂 Executors 建。 Executors 可以 2
型的 ScheduledThreadPoolExecutor ,如下。
  • ScheduledThreadPoolExecutor。包含若干个线程的ScheduledThreadPoolExecutor
  • SingleThreadScheduledExecutor。只包含一个线程的ScheduledThreadPoolExecutor
下面是工厂 Executors 提供的, 建固定个数 线 程的 ScheduledThreadPoolExecutor API
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize,threadFactory)
ScheduledThreadPoolExecutor 适用于需要多个后台 线 行周期任 ,同 时为
管理的需求而需要限制后台 线 程的数量的 景。下面是 Executors 提供的, 线
SingleThreadScheduledExecutor API
public static ScheduledExecutorService newSingleThreadScheduledExecutor()
public static ScheduledExecutorService newSingleThreadScheduledExecutor
(ThreadFactory threadFactory)
SingleThreadScheduledExecutor 适用于需要 个后台 线 行周期任 ,同 需要保 证顺
序地 行各个任 景。
3 Future 接口
Future 接口和 实现 Future 接口的 FutureTask 用来表示异步 算的 果。当我 Runnable
接口或 Callable 接口的 实现类 提交( submit ThreadPoolExecutor
ScheduledThreadPoolExecutor ThreadPoolExecutor ScheduledThreadPoolExecutor 会向我 们返回一个 FutureTask
<T> Future<T> submit(Callable<T> task)
<T> Future<T> submit(Runnable task, T result)
Future<> submit(Runnable task)
有一点需要 者注意,到目前最新的 JDK 8 止, Java 上述 API 返回的是一个
FutureTask 象。但从 API 可以看到, Java 仅仅 返回的是一个 实现 Future 接口的 象。在将
来的 JDK 实现 中,返回的可能不一定是 FutureTask
4 Runnable 接口和 Callable 接口
Runnable 接口和 Callable 接口的 实现类 ,都可以被 ThreadPoolExecutor Scheduled-
ThreadPoolExecutor 行。它 的区 Runnable 不会返回 果,而 Callable 可以返回
除了可以自己 实现 Callable 接口的 象外, 可以使用工厂 Executors 来把一个
Runnable 包装成一个 Callable
下面是 Executors 提供的,把一个 Runnable 包装成一个 Callable API
public static Callable<Object> callable(Runnable task) // 返回 Callable1

下面是Executors提供的,把一个Runnable和一个待返回的果包装成一个CallableAPI 

public static <T> Callable<T> callable(Runnable task, T result) // 返回 对象Callable2
前面 讲过 ,当我 把一个 Callable 象(比如上面的 Callable1 Callable2 )提交
ThreadPoolExecutor ScheduledThreadPoolExecutor submit )会向我 返回一个
FutureTask 象。我 可以 FutureTask.get() 方法来等待任 务执 行完成。当任 成功完成后
FutureTask.get() 将返回 果。例如,如果提交的是 Callable1 FutureTask.get() 方法
将返回 null ;如果提交的是 Callable2 FutureTask.get() 方法将返回 result 象。
下篇将详解 ThreadPoolExecutor

猜你喜欢

转载自blog.csdn.net/m0_60264772/article/details/122778045