简介
在JDK5后主要提供的多线程处理都在java.util.concurrent包中,多线程的主要抽象不是Thread,而是Executor,Executor为接口,定义在java.util.concurrent包下,只定义了一个方法:
public interface Executor {
void execute(Runnable command);
}
它提供了一种标准的方法将任务的提交和过程和执行过程解耦,并用Runnable来表示任务,Executor的实现还提供了对生命周期的支持,以及统计信息收集、应用程序管理机制和性能监视机制。Executor基于生产者——消费者模式,提交任务的过程就相当于是生产者,生成待完成的工作单元,执行任务的过程相当于消费者,执行完这些工作单元。如果在程序中实现一个生产者——消费者的设计,那么最简单的方法就使用Executor。每当看到下面这种形式的代码:new Thread(runnable).start(),最好考虑使用Executor来代替更加灵活。
线程池
线程池指管理一组同构工作线程的资源池,线程池是与工作队列密切相关的,在工作队列中保存了所有等待执行的任务,工作者线程的任务很简单:从工作队列中获取一个任务,执行任务,然后返回线程池并等待下一个任务。“在线程池中执行任务”比“为每个任务分配一个线程”有更大优势,通过重用现有线程,而不是创建新线程,可以在处理多个请求时分摊在线程创建和销毁过程中产生的巨大的开销,另外,当请求到达时,工作线程已经存在,因此不会由于等待创建线程而延迟任务的执行,从而提高响应性,通过调整线程池的大小,可以创建足够多的线程以便使处理器保持忙碌的状态,同时还可以防止过多的线程相互竞争资源而应用程序耗尽内存。
无限制创建线程的不足
1、线程生命周期的开销非常高。线程的创建也销毁并不是没有代价的,根据平台的不同实际开销也不同,但线程的创建过程都需要时间,延迟请求的处理,并且需要JVM和操作系统提供一些辅助操作。
2、资源消耗。活跃的线程会消耗系统资源,特别是内存,如果可以运行的线程数量多于可用的处理器数量,那么有些线程就会闲置,大量的闲置线程就会占用很多的内存,如果你已经有足够多的线程使处理器保持忙碌状态,那么创建更多的线程反而会降低性能。
3、稳定性。在可创建线程的数量上存在一个限制,不同平台不同,而且受多个因素制约,包括JVM启动参数、Thread构造函数中请求的栈大小,以及底层操作系统对线程的限制等,如果破坏了这些限制将抛出OutOfMemoryError异常。
Executor的生命周期
为了解决执行服务的生命周期问题,ExecutorService扩展了Executor接口,添加了一些用于生命周期的管理方法,下面代码为ExecutorService接口的定义:
public interface ExecutorService extends Executor {
void shutdown();
List<Runnable> shutdownNow();
boolean isShutdown();
boolean isTerminated();
boolean awaitTermination(long timeout, TimeUnit unit)
throws InterruptedException;
......
}
ExecutorService有三种状态:运行、关闭、终止,ExecutorService在初建时属于运行状态,shutdown方法将执行平缓的关闭过程:不再接受新的任务,同时等待已经提交的任务执行完成,包括那些还未开始执行的任务。shotdownNow()方法将粗暴的关闭过程:它将尝试取消所有运行中的任务,并且不再启动队列中尚未开始执行的任务。
分享到:
相关推荐
Executor框架的设计理念是将任务的创建与任务的执行解耦,使得系统能够更好地管理和控制并发执行的任务。 首先,我们来了解一下Executor框架的核心接口`Executor`。`Executor`接口只有一个方法`execute(Runnable ...
该文档详细记录了Executor框架结构、使用示意图、ThreadPoolExecutor使用示例、线程池原理分析、几种常见线程池(FixedThreadPool、SingleThreadExecutor、CachedThreadPool)的详解以及线程池大小确定等内容
Java中的Executor框架是多线程编程的一个重要组成部分,它始于JDK5,目的是为了更好地管理和控制线程的执行。Executor框架的设计理念是将任务(工作单元)与执行机制分离,从而提高了程序的可扩展性和灵活性。 1. *...
本文将深入探讨Executor框架的设计哲学、核心组件,并结合实例演示如何利用这一框架提升程序的性能和响应性。 注意事项和最佳实践 合理配置线程池大小:根据系统的负载和任务的性质来决定线程池的大小。 资源清理:...
在`Executor`框架中,`ExecutorService`是核心接口,它扩展了`Executor`接口并添加了一些用于管理和控制线程池的方法,如提交任务、关闭线程池等。Android开发者通常会使用`ThreadPoolExecutor`或`...
本文将深入探讨Java的Executor框架,这是一个用于管理和执行并发任务的强大工具。通过理解其核心概念和工作原理,开发者可以更有效地利用多核处理器的优势,提高应用程序的性能和响应能力。 ## Java的主要特点回顾 ...
Java中的线程池Executor框架是Java并发编程中的一种常见机制,用于管理和执行异步任务。通过使用线程池,可以大大减少线程的创建和销毁开销,从而提高系统的性能和稳定性。 Executor框架是Java中的一个核心框架,...
Java的Executor框架是Java 1.5引入的用于管理和控制多线程的一种机制,它旨在解决直接使用`new Thread(…).start()`方法创建线程所带来的问题。在传统的多线程编程中,直接创建和销毁线程会导致大量开销,且无法有效...
本文将详细解读Java中Executor框架的线程池原理和源码,同时探讨线程池的调优和监控方法。 首先,线程池的主要作用包括:避免了线程的无限制创建,减少了线程创建和销毁的开销,提升系统性能;实现任务的快速响应,...
- **提供任务调度功能**:除了基本的任务执行外,Executor框架还支持任务的定时执行和周期性执行,增强了程序的功能性和灵活性。 #### 2. 原子操作与Java API中的原子类 原子操作是并发编程中的另一个关键概念。一...
Executor 框架的实例详解可以帮助开发者更好地理解和使用 Executor 框架,以下是 Java Executor 框架的实例详解的相关知识点: 一、Executor 框架的介绍 Executor 框架是 Java 中一个高级的并发编程模型,提供了一...
8.2 使用Executor框架创建线程池 8.3 线程池的优势和适用场景 9. 线程中断: 9.1 如何中断线程 9.2 处理中断请求 10. 线程状态: 10.1 线程的生命周期 10.2 如何获取线程状态 11. 线程异常处理: ......
开发中碰到的
Java的Executor框架是线程池的核心,它定义了执行任务的基本接口。通过ExecutorService,我们可以提交任务并控制线程的生命周期。线程池通过ThreadPoolExecutor进行具体实现,该类提供了创建和管理线程池的能力。 ...
开发者可以通过 Executor 框架来创建线程池,并将任务提交给线程池来执行。 线程池的优点包括: * 减少资源消耗:线程池可以重复使用线程,从而减少创建和销毁线程的次数。 * 提高响应速度:使用线程池可以快速...
3. **线程池接口与实现**:在Java中,`java.util.concurrent.Executor` 是线程池的顶级接口,它定义了执行任务的基本方法。`ExecutorService` 是实际的线程池接口,提供了更丰富的管理和控制线程池的方法。`...
Java并发框架中的Executor服务是...总之,Java的Executor并发框架是多线程编程的强大工具,理解并熟练使用ExecutorService和相关工厂类,能够帮助开发者更好地设计和优化并发程序,提高系统的并发性能和资源利用率。
1、Executor框架简介 从JDK5开始,工作单元和执行机制隔离开来,工作单元包括Runnable和Callable,执行机制由Executor提供。 调用关系:Java线程一对一映射到本地操作系统的系统线程,当多线程程序分解若干...
在 JavaSE 第 7 天的学习中,我们学习了两大重要的知识点:线程池和 lambda 表达式。下面我们将详细讲解这两个知识点,并通过实践题目来加深理解。 一、线程池 线程池是 Java 中的一种机制,用于管理和重用线程。...