Executor框架是指java 5中引入的一系列并发库中与executor相关的一些功能类,其中包括线程池,Executor,Executors,ExecutorService,CompletionService,Future,Callable等。框架结构图如下:
使用Executor来执行多个线程的好处是用来避免线程的创建和销毁的开销,以提升效率。因此如果某些场景需要反复创建线程去处理同类事务的话,可以考虑使用线程池来处理。
一、创建ExecutorService
Executors类,提供了一系列工厂方法用于创先线程池,返回的线程池都实现了ExecutorService接口。Executors下获取ExecutorService 的方法有很多,如单线程线程池、固定线程数的线程池等,不过最终还是调用ExecutorService的构造函数来创建,如下:
public ThreadPoolExecutor(int corePoolSize,//
核心线程数
int maximumPoolSize,//最大线程数
long keepAliveTime,//
线程保持活动的时间,该时间就是超过核心池大小的线程可以在终止前保持空闲的时间值。
TimeUnit unit,//等待时间的单位
BlockingQueue<Runnable> workQueue,//等待线程队列
ThreadFactory threadFactory)//线程生产工厂
通过以上方法就可以创建一个线程池,可以限制线程的数量和等待队列中线程的等待时间等。
Executors提供以下静态工厂方法创建一个线程池:
public static ExecutorService newFixedThreadPool(int nThreads)
创建一个定长的线程池。达到最大线程数后,线程数不再增长,新增任务保存在workQueue中。如果一个线程由于非预期Exception而结束,线程池会补充一个新的线程。
public static ExecutorService newCachedThreadPool()
创建一个可缓存的线程池,调用execute 将重用以前构造的线程(如果线程可用)。如果现有线程没有可用的,则创建一个新线程并添加到池中。终止并从缓存中移除那些已有 60 秒钟未被使用的线程。
public static ExecutorService newSingleThreadExecutor()
创建一个单线程化的Executor。
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)
创建一个支持定时及周期性的任务执行的线程池,可用来替代Timer类。
二、ExecutorService生命周期
为了解决执行服务的生命周期问题,ExecutorService接口扩展了Executor,提供了三种状态,运行 ,关闭 ,终止。Executor创建时处于运行状态。当调用ExecutorService.shutdown()后,处于关闭状态,isShutdown()方法返回true。这时,不应该再想Executor中添加任务,所有已添加的任务执行完毕后,Executor处于终止状态,isTerminated()返回true。如果Executor处于关闭状态,往Executor提交任务会抛出unchecked exception RejectedExecutionException。
三、使用Callable,Future返回结果
Future<V>代表一个异步执行的操作,通过get()方法可以获得操作的结果,如果异步操作还没有完成,则,get()会使当前线程阻塞。FutureTask<V>实现了Future<V>和Runable<V>。Callable代表一个有返回值得操作。
ExecutoreService提供了submit()方法,传递一个Callable,或Runnable,返回Future。如果Executor后台线程池还没有完成Callable的计算,这调用返回Future对象的get()方法,会阻塞直到计算完成。
四、CompletionService
将生产新的异步任务与使用已完成任务的结果分离开来的服务。生产者 submit 执行的任务。使用者 take 已完成的任务,并按照完成这些任务的顺序处理它们的结果。
通常,CompletionService 依赖于一个单独的 Executor
来实际执行任务,在这种情况下,CompletionService 只管理一个内部完成队列。ExecutorCompletionService
类提供了此方法的一个实现。
相关推荐
Executor框架是Java并发编程的核心组件,它在Java 5中被引入,极大地简化了多线程编程。这个框架是基于`java.util.concurrent`包中的接口和类构建的,旨在提供线程池服务、任务调度以及并发执行任务的能力。Executor...
该文档详细记录了Executor框架结构、使用示意图、ThreadPoolExecutor使用示例、线程池原理分析、几种常见线程池(FixedThreadPool、SingleThreadExecutor、CachedThreadPool)的详解以及线程池大小确定等内容
Java通过引入Executor框架,为并发任务的执行提供了一种高效、灵活的管理机制。本文将深入探讨Executor框架的设计哲学、核心组件,并结合实例演示如何利用这一框架提升程序的性能和响应性。 注意事项和最佳实践 合理...
# 掌握并发的钥匙:Java Executor框架深度解析 Java作为一种广泛应用的编程语言,自1995年由Sun Microsystems公司(现属Oracle公司)首次发布以来,已经发展成为软件开发领域的重要工具。Java的设计目标包括跨平台...
Java中的Executor框架是多线程编程的一个重要组成部分,它始于JDK5,目的是为了更好地管理和控制线程的执行。Executor框架的设计理念是将任务(工作单元)与执行机制分离,从而提高了程序的可扩展性和灵活性。 1. *...
Java的Executor框架是Java 1.5引入的用于管理和控制多线程的一种机制,它旨在解决直接使用`new Thread(…).start()`方法创建线程所带来的问题。在传统的多线程编程中,直接创建和销毁线程会导致大量开销,且无法有效...
### 针对Executor框架与线程共享数据的深入探讨 #### 1. Executor框架的重要性与优势 在Java并发编程领域中,Executor框架扮演着一个非常核心的角色。它为开发者提供了一个高效且易于使用的线程池管理方案。下面将...
Java Executor 框架的实例详解 Java Executor 框架是 Java 中一个很重要的并发编程模型,主要用于并发任务的执行和管理。Executor 框架的实例详解可以帮助开发者更好地理解和使用 Executor 框架,以下是 Java ...
1、Executor框架简介 从JDK5开始,工作单元和执行机制隔离开来,工作单元包括Runnable和Callable,执行机制由Executor提供。 调用关系:Java线程一对一映射到本地操作系统的系统线程,当多线程程序分解若干...
Java并发之线程池Executor框架的深入理解 Java中的线程池Executor框架是Java并发编程中的一种常见机制,用于管理和执行异步任务。通过使用线程池,可以大大减少线程的创建和销毁开销,从而提高系统的性能和稳定性。...
非常好的Java并发框架Executor图例,结构清晰,继承关系清楚。
Java Executor 框架是Java并发编程中一个重要的组件,它是Java 5引入的一个核心工具,用于管理和控制线程的执行。Executor 框架的主要目的是简化多线程编程,提高程序的可维护性和可扩展性。这个框架的核心是 `...
开发中碰到的
Java并发编程学习宝典(漫画版),Java并发编程学习宝典(漫画版)Java并发编程学习宝典(漫画版)Java并发编程学习宝典(漫画版)Java并发编程学习宝典(漫画版)Java并发编程学习宝典(漫画版)Java并发编程学习...
可以将此种模式分为两层,在上层,Java多线程程序通常把应用程序分解为若干任务,然后使用用户级的调度器(Executor框架)讲这些任务映射为固定数量的线程;在底层,操作系统内核将这些线程映射到硬件处理器上。 3....
Java中的Executor框架提供了一种灵活的方式来管理线程池,从而实现任务的并发执行。 首先,线程池的基本思想是通过预先创建一定数量的线程,来执行一系列的任务。在没有线程池的情况下,为每个任务启动一个新线程会...
在现代多线程编程中,Java线程池(Executor框架)扮演着至关重要的角色。它不仅提高了程序的性能,还有效地管理了资源。本文将深入探讨Java线程池的工作原理,并通过实际代码示例,展示如何高效地使用线程池。 ...
4.2 使用Executor框架启动线程池 5. 传递参数给线程: 5.1 使用构造方法传递参数 5.2 使用类成员变量传递参数 6. 线程同步: 6.1 线程安全性概述 6.2 使用同步方法 6.3 使用同步块 6.4 使用Lock和Condition 6.5 使用...
同时,Java也提供了线程池、Executor框架等机制来管理线程的创建和执行。 下面是Java并发编程面试题的详细知识点: 基础知识 * 并发编程的优缺点 * 为什么要使用并发编程 * 并发编程三要素是什么? * 在Java程序...