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

java concurrent包中任务执行框架分析

阅读更多

提到java并发编程必然绕不过java的线程和任务接口;那么,构建java多线程程序,必然需要使用到Thread类和Runnable接口;此处,只考虑异步任务创建、线程创建与启动,暂时不考虑线程互斥和同步、线程安全等;看看通常异步任务创建与线程创建、启动,通常使用两种方式创建任务、并启动线程执行任务:
方式一:继承Thread,重写run方法

class Task extends Thread{

	@Override
	public void run() {
		//do something
	}
	
	public static void main(String[] args) throws InterruptedException, IOException {
		Task thread = new Task();
		thread.start();
		Thread.sleep(1000);
	}
	
}


方式二:任务实现Runnable接口,启动线程执行任务

class Task implements Runnable {

	@Override
	public void run() {
		//do something
	}
	
	public static void main(String[] args) throws InterruptedException, IOException {
		Thread thread = new Thread(new Task());
		thread.start();
		Thread.sleep(1000);
	}
	
}


从示例观察,整个线程创建、执行存在一下问题:

  • 任务与线程概念耦合,线程与任务之间界限模糊
  • 线程管理由任务提交者全权负责,职责模糊
  • 线程无法重复利用,造成线程的重复创建与销毁--由于Thread执行完毕,不能再次执行其他任务
  • 对于需要线程管理、状态查询等等功能,没有很好的支持
  • 当需要查询任务返回结果、查询任务执行状态,中断任务执行等等管理功能时,都需要自行设计复杂的任务实现



再来看看java.util.concurrent包,对于上述问题,新的并发框架都给出了很不错的解决方案,提供了一下几个职责模型:

  • 任务类型:Runnable无返回结果、Callable有返回结果
  • 任务与线程执行分离:Executor
  • 执行线程管理与任务管理:ExecutorService
  • 任务管理功能:Future
  • 基于线程池的线程执行管理:ThreadPoolExecutor

此外,还提供了定时任务执行ScheduledExecutorService;任务生产者与消费者解耦CompletionService等等;具体看看关于java.util.concurrent包中线程与任务执行的核心类图:


各个核心接口的职责:

 

接口/类 职责

Executor

执行提交的Runnable任务;该接口解耦了任务提交与任务执行(线程使用、调度等等)

ExecutorService

提供了管理线程终止的方法、以及返回跟踪一个或多个异步任务的Future方法

ScheduledExecutorService

管理任务延迟执行或者周期执行

CompletionService

解耦异步任务生产与已完成任务结果消费

AbstractExecutorService

提供默认实现

ThreadPoolExecutor

提供基于线程池执行提交任务的机制,通常使用Executors工厂方法配置

Worker

ThreadPoolExecutor中线程池中最小单元,工作线程;用户提交任务都是由这些工作线程执行

ThreadFactory

创建新线程接口

Future

管理异步任务,并获取异步任务计算结果

RunnableFuture

代理异步任务执行;其run方法执行完成使得Future完成,并且可以获取结果

ScheduledFuture

延迟任务管理接口

RunnableScheduledFuture

可执行的延迟任务管理接口

FutureTask

异步任务管理接口默认实现

QueueingFuture

异步任务执行完毕时,进入阻塞队列

 

上述关键接口的满足了对于任务与线程区分管理、线程创建、任务执行管理、线程池管理、异步任务管理等等功能;

同时,还提供了Executors工厂方法管理线程池、任务封装等等功能

 

可以发现线程与任务管理框架的核心实现在于ThreadPoolExecutor,以及任务管理实现FutureTask;如果需要深入线程管理与调度、任务管理可以深入分析这两个类的实现

 

 

  • 大小: 151.5 KB
分享到:
评论

相关推荐

    java并发工具包 java.util.concurrent中文版pdf

    为了简化并发编程的复杂性,Java 5 引入了 `java.util.concurrent` 包,提供了一系列强大的类和接口,帮助开发者更高效地管理多线程任务。 #### 二、`java.util.concurrent` 概览 `java.util.concurrent` 包提供了...

    java的concurrent用法详解

    `Executor`框架是`java.util.concurrent`的核心组件之一,它为任务的执行提供了一个统一的接口。其中最重要的接口是`ExecutorService`,它定义了线程池的行为,使得我们可以将任务(`Runnable`或`Callable`对象)...

    java Fork Join框架及使用

    在Fork/Join框架出现之前,Java已经提供了多种多线程解决方案,如java.util.concurrent包中的ExecutorService接口及其实现类ThreadPoolExecutor。与之相比,ForkJoinPool的一个不同之处在于,它为每个线程提供了独立...

    The java.util.concurrent Synchronizer Framework

    `java.util.concurrent`包中的`AbstractQueuedSynchronizer`框架为Java开发者提供了一个强大的工具箱,使得他们能够高效地实现各种同步器。通过对同步状态的有效管理、阻塞和唤醒机制的优化以及灵活的扩展性设计,...

    Doug Lea, Concurrent Programming in Java Design Principles and Patterns

    4. **Java并发工具**:Doug Lea详细介绍了java.util.concurrent包中的各种工具类,如Executor框架、Semaphore信号量、CountDownLatch倒计时器、CyclicBarrier回环栅栏和Future异步计算接口。这些工具极大地简化了...

    Java的concurrent包动画演示

    1. **Executor框架**:Java `concurrent`包中最核心的概念是`Executor`框架,它将任务的提交和执行分离,简化了多线程应用的设计。`ExecutorService`是执行任务的主要接口,而`ThreadPoolExecutor`是其最常见的实现...

    The java. util. concurrent synchronizer framework.pdf

    AQS(AbstractQueuedSynchronizer)是Java.util.concurrent包中同步器的基础框架,它的核心设计思想与实现方法在Doug Lea先生的这篇论文中有详细的介绍。论文详细阐述了AQS框架的原理、设计、实现、应用以及性能等...

    JAVA多线程框架.pdf

    线程池是Java.util.concurrent包中的核心概念,它允许我们预先创建一定数量的线程,然后复用这些线程来执行任务,避免了频繁地创建和销毁线程带来的开销。`ExecutorService`是线程池的接口,通过`Executors`工厂类...

    Concurrent.and.Distributed.Computing.in.Java

    Java提供了多种机制来保证线程安全,如`synchronized`关键字、`volatile`变量以及`java.util.concurrent`包中的高级并发工具类。 2. **死锁**:当两个或更多的线程在执行过程中,每个线程都在等待另一个线程释放...

    The java.util.concurrent synchronizer framework.pdf

    关于AbstractQueuedSynchronizer,它是java.util.concurrent包中并发控制的核心组件,为Java并发工具类提供了底层机制支持,例如ReentrantLock、Semaphore、CountDownLatch等,都依赖于这个框架来实现同步。...

    Concurrent_Programming+Java Concurrency in Practice+langspec

    书中强调了线程安全、同步、线程池、并发集合、死锁、活锁与饥饿等核心概念,以及如何使用java.util.concurrent包中的类和接口。例如,`ExecutorService`和`Future`接口,它们为管理和控制并发任务提供了便利;`...

    Java并发编程之——Amino框架

    4. **并发原语封装**:框架可能封装了Java的并发原语,如synchronized、volatile、java.util.concurrent.atomic包中的原子类,提供了更简洁、更安全的API供开发者使用。 5. **并发编程模式**:Amino可能提供了对...

    JAVA多线程框架[定义].pdf

    Java多线程框架是Java编程中处理并发问题的关键工具,主要集中在`java.util.concurrent`包中。这个包是在JDK 5版本中引入的,其中包含了许多由Doug Lea设计的高效并发工具类。Doug Lea是一位在并发编程领域有着深厚...

    java5 并发包 (concurrent)思维导图

    Java 5并发包(`java.util.concurrent`,简称`Concurrent`包)是Java平台中用于多线程编程的重要组成部分,它提供了丰富的并发工具类,极大地简化了在多线程环境下的编程工作。这个包的设计目标是提高并发性能,减少...

    concurrent 源代码

    5. **Fork/Join框架**: `java.util.concurrent.ForkJoinPool`和`RecursiveTask`或`RecursiveAction`类,它们基于工作窃取算法,用于执行可拆分的计算任务,特别适合并行化大数据处理。 6. **CompletableFuture**: ...

    JAVA_API1.6文档(中文)

    java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器。 java.util.jar 提供读写 JAR (Java ARchive) 文件格式的类,该格式基于具有可选清单文件的标准 ZIP 文件格式。 ...

    JAVA将一个数据中数据定时自动复制(抽取)到另一个数据库

    通过使用`java.lang.Thread`类或者`java.util.concurrent`包中的`ExecutorService`,我们可以创建和管理线程。例如,我们可以定义一个继承自Thread的子类,重写`run`方法来实现数据抽取逻辑,或者使用`Runnable`接口...

Global site tag (gtag.js) - Google Analytics