`
flychao88
  • 浏览: 753290 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【转】Java Executor框架在多线程应用中的使用

 
阅读更多

java平台一直对并发程序设计和多线程有这很好的支持。但在早期这种支持也只是在应用层调用原生结构,这种方式最大的缺陷就是使这些原始构件有效的被调用;否则,应用将不能正确运行或者不能达到期望结果。

 

Executor框架自java1.5中被作为comcurrency包的一部分被引入。它是java多线程的一个抽象层实现,并且作为java中首个实用的并发框架被用来标准调用、在并行线程中调度、执行以及控制异步任务。执行规则在创建构造器的时候就已经被定义,之后executor按照之前设置好的规则来调用并发线程。

 

在java中Executor的实现使用线程池,该线程池由workder线程组成。由于worker线程的管理都由该框架来完成,因此和早先多线程方法来比内存开销小了很多。

图1:java Executor Service

在java1.5之前,多线程应用使用线程组、线程池或者自定义线程池,这样一来,整个线程管理需要程序员牢记以下几点责任:

  • 线程同步

  • 线程等待

  • 线程join

  • 线程锁

  • 线程通知

  • 处理死锁

 

以及更多在应用需求之外产生的并发执行问题。在实际项目实现过程中有时控制多线程应用是非常困难的。同时线程的表现行为也依赖与所在应用的部署和运行环境,因此,同一个应用在不同的部署环境下可能有不能的行为结果。例如,处理器速度、RAM内存大小、带宽都会直接影响多线程应用。所以我们在构建多线程架构之前都要谨记这些影响因素。

 

Java Executor框架为多线程应用提供了一个更加容易的抽象层。其中executor抽象层隐藏了并发执行部分,程序员只需要关注业务逻辑实现即可。在executor框架中所有的并行工作都被视为任务而不是看作简单的线程,所以此时应用只需要简单的处理Runnable实例(这是一组基本任务或并行工作的集合),接下来这些任务会被传给一个Executor来处理。ExecutorService接口继承了Executor接口。此外java Executor框架有生命周期方法来管理真个并发执行流程。

 

Executor通过使用Runnable或这Callable实例来创建任务。使用Runnable时,run方法并不返回任何值或者抛出异常;但是Callable在这方面提供了更多功能,它定义了一个call方法来允许返回计算值并且可在future处理中使用这个值,同时如果需要的话还可以抛出异常。

 

而FutureTask类又是另外一个重要的组件,该组件可以用来获取处理后的信息。该类的实例可以用来包装Callable或者Runnable。我们可以通过ExecutorService的submit方法的一个该类实例的返回值,同时我们还可以在调用execute方法前手动使用FutureTask来包装我们的任务。

以下是实现java ThreadPoolExecutor的功能步骤:

  • 创建线程池

  • 创建一个队列来存放所有还没有被分配给线程池中线程的任务

  • 当队列中一个或多个任务不能被分配时用拒绝处理程序(Rejection handler)来处理。按默认拒绝策略,拒绝处理程序将简单的抛出一个RejectedExecutionException运行时异常,应用程序可以捕获或丢弃该异常


图2:Thread Pool Executor

下面的例子会展示executor框架的生命周期。这个例子仅覆盖基本的步骤和接口,还有更多的属性和子类来满足不同类型应用的需求。

 

下面的类实现了Runnable接口,它的实例将在下一小节的代码中被用作任务。

代码片段1:实现Runnable接口的类

代码片段2:实现Executor任务的类

接下来我们将描述在应用中实现java executor框架的步骤。

 

创建Executor

首先,我们需要创建一个Executor或者ExecutorService实例。Executor类有很多静态工厂方法来根据应用的不同需求创建ExecutorService。以下是两种创建executor服务的两种主要方式:

  • newFixedThreadPool()返回一个包含已初始化并且没有上限队列以及固定数量线程的ThreadPoolExecutor实例

  • newCachedThreadPool()返回一个包含无上限队列和无线程限制的ThreadPoolExecutor实例

 

第一种方式中执行过程中并未创建额外的线程。因此如果没有空闲线程可用那么任务将等待直到有空闲线程才能执行。在第二种方式中,已经创建的线程如果空闲则将被再利用,但是如果没有线程可用时将创建一个新的线程并将该线程加入到线程池中用来完成任务处理。对于空闲时间超过一个设定的超时时间以后,将被自动从线程池中移除。

 

下面是创建10个固定线程的线程池:

下面是创建缓冲线程池代码:


 

下面则是自定义线程池的例子。其中参数值由项目具体需求决定。这里线程池有8个核心线程可以并行处理,最大线程数为12。队列可以持有250个任务。这里有一点需要注意的是池的大小需要保持较大的值以满足所有任务。空闲时间限制保持在5毫秒。

创建一个或多个任务放入队列

创建executor完成之后紧接着就要创建任务了。创建一个或多个可以做为Runnable或Callable实例执行的任务。在这个框架中,所有的任务都是在队列中被创建和填充。当任务创建完成以后填充队列被提交并发执行。

 

提交任务到Executor

创建完ExecutorService和task之后,我们需要通过submit或者execute方法提交任务到executor。现在按照我们的配置,任务将被从队列中取出并发执行。例如,如果配置并发执行数为5,那么一次将从队列中取出5个任务来并发执行。该处理l直到队列中所有的任务都处理完才停止。

 

执行任务

接下来,实际的任务执行将由框架来管理。Executor负责对任务的执行、线程池、同步以及队列进行管理。如果线程池中线程数少于配置中的最小线程数,executor将按照要求创建新的线程来处理队列中的任务直到达到最小线程数为止;如果线程数大于配置的最小线程数,那么线程池将不会再创建线程。相反,任务将一直保持在队列中,直到有新的线程空闲来处理该请求。如果队列已满,则会创建一个新的处理线程,但换句话说这取决于创建executor使所使用用的构造函数。

 

关闭Executor

终止executor的方式是调用shutdown方法。同时我们可以选择平滑关闭或者直接关闭。

 

总结

经过以上的讨论,很明显并发框架是非常高效的并且在多线程应用中被广泛使用。这是java中引入的第一个并发框架,它为并发编程增加了一个新的维度。程序员通过使用executor框架增加了程序的灵活性,同时也避免了内存同步的开销而使程序更加稳定。

分享到:
评论

相关推荐

    Java并发编程利器:Executor框架深度解析与应用实践

    在现代Java应用开发中,多线程并发编程已成为提升程序性能的关键技术之一。Java通过引入Executor框架,为并发任务的执行提供了一种高效、灵活的管理机制。本文将深入探讨Executor框架的设计哲学、核心组件,并结合...

    Executor框架使用详解

    Executor框架是Java并发编程的核心组件,它在Java 5中被引入,极大地简化了多线程编程。这个框架是基于`java.util.concurrent`包中的接口和类构建的,旨在提供线程池服务、任务调度以及并发执行任务的能力。Executor...

    Java多线程之Executor框架.docx

    Java的Executor框架是Java 1.5引入的用于管理和控制多线程的一种机制,它旨在解决直接使用`new Thread(…).start()`方法创建线程所带来的问题。在传统的多线程编程中,直接创建和销毁线程会导致大量开销,且无法有效...

    掌握并发的钥匙:Java Executor框架深度解析

    为了简化多线程编程,Java标准库提供了`java.util.concurrent`包,其中包含了一系列高级并发工具,而Executor框架就是其中之一。 ### Executor框架概述 Executor框架提供了一种执行异步任务的方法,它允许开发者将...

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

    在Java并发编程领域中,Executor框架扮演着一个非常核心的角色。它为开发者提供了一个高效且易于使用的线程池管理方案。下面将详细介绍使用Executor框架的主要好处: - **简化线程管理**:Executor框架简化了线程的...

    Java Executor 框架的实例详解

    Executor 框架的实例详解可以帮助开发者更好地理解和使用 Executor 框架,以下是 Java Executor 框架的实例详解的相关知识点: 一、Executor 框架的介绍 Executor 框架是 Java 中一个高级的并发编程模型,提供了一...

    Java的多线程(java基础)

    Java的多线程是其编程语言中的一个重要特性,允许在单个程序中同时执行多个任务,从而提高程序的效率和响应性。理解多线程对于Java开发者至关重要,尤其对初学者来说,是掌握高级编程技巧的基础。 首先,我们需要...

    汪文君JAVA多线程编程实战(完整不加密)

    在Java平台中,多线程是并发处理的基础,对于构建高效、可扩展的系统至关重要。 Java多线程允许程序同时执行多个独立的代码段,这在处理大数据、网络通信、用户界面更新等场景中尤其有用。书中详细介绍了Java多线程...

    Java多线程编程实战指南-核心篇

    《Java多线程编程实战指南-核心篇》是一本深入探讨Java并发编程的书籍,旨在帮助读者掌握在Java环境中创建、管理和同步线程的核心技术。Java的多线程能力是其强大之处,使得开发者能够在同一时间执行多个任务,提高...

    【JAVA多线程】多线程编程核心技术学习资料

    这份"Java多线程编程核心技术"的学习资料应该涵盖了以上所述的各个知识点,并可能深入讨论了如何在实际项目中有效地应用多线程,解决并发问题,优化性能。通过阅读这本书,开发者可以深入理解Java多线程编程的核心...

    Java多线程编程模板

    在Java编程中,多线程是程序设计中的一个重要概念,特别是在服务器端应用和高并发场景下,多线程能够充分利用CPU资源,提高程序的执行效率。本知识点将深入探讨Java多线程编程模板,帮助开发者理解和掌握如何在Java...

    多线程简介以及在JAVA项目中的应用

    本文将深入探讨多线程的基本概念、使用原因、应用场景以及在Java项目中的具体应用。 1. 什么是多线程 多线程是一种编程模型,允许在单个应用程序中同时执行多个独立的任务。在硬件层面,多线程可以通过对称多处理...

    Java多线程的总结

    Java多线程是Java编程中的一个核心概念,它在现代软件开发中扮演着至关重要的角色。多线程允许程序同时执行多个任务,提高了系统资源的利用率,提升了应用程序的响应速度和并发性能。对于大型分布式系统、Web应用...

    java多线程进阶

    2. **线程同步**:为了解决多线程中的数据安全问题,Java提供了多种同步机制,如`synchronized`关键字、`volatile`变量、`Lock`与`Condition`接口、`ReentrantLock`等。这些内容在书中会有详细讲解,包括它们的工作...

    java 多线程编程实战指南(核心 + 设计模式 完整版)

    在Java编程领域,多线程是一项至关重要的技术,它能够充分利用多核处理器的计算能力,提高应用程序的响应速度和并发性能。《Java多线程编程实战指南》这本书深入浅出地讲解了Java多线程的核心概念和实战技巧,分为...

    JAVA多线程教材

    Java多线程是Java编程中的核心概念,尤其在开发高并发、高性能的应用程序时不可或缺。本书籍《JAVA多线程教材》显然会深入探讨这一主题,帮助开发者掌握如何有效地利用多核处理器,提高程序的执行效率。PDF格式的...

    Java多线程结构_Java多线程结构_

    Java 5引入了Executor框架,这是处理多线程的现代方式。ExecutorService接口是线程池的入口,它提供了一组用于管理和控制线程的方法。ThreadPoolExecutor是ExecutorService的一个实现,可以配置线程池的大小、队列...

    JAVA多线程的一个带UI界面的例子

    在Java编程中,多线程是一项关键特性,...总之,这个"JAVA多线程的一个带UI界面的例子"涵盖了Java多线程编程和GUI设计的核心概念,通过实际的代码示例,有助于开发者深入理解如何在实际应用中正确、高效地使用多线程。

    java多线程示例

    在Java编程语言中,多线程是核心特性之一,它允许程序同时执行多个任务,从而提高了应用程序的效率和响应速度。本示例着重探讨如何在Java中实现和管理多线程,以及它带来的挑战和解决方案。 一、Java多线程基础 1. ...

    Java多线程程序设计

    Java多线程程序设计是Java开发中的重要领域,它允许应用程序同时执行多个任务,从而提高系统资源的利用率和程序的响应速度。在Java中,多线程主要通过两种方式实现:继承Thread类和实现Runnable接口。 一、创建线程...

Global site tag (gtag.js) - Google Analytics