`
yychao
  • 浏览: 97692 次
  • 性别: 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_API1.6文档(中文)

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

    Java 1.6 API 中文 New

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

    JavaAPI1.6中文chm文档 part1

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

    java api最新7.0

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

    JavaAPI中文chm文档 part2

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

    java jdk-api-1.6 中文 chmd

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

    javaeye热点阅读

    1.7 Java5 Concurrent包中的锁机制 1.8 设计模式解读之一: 策略模式 1.9 外观模式(Facade Pattern) 追MM1.10 做一个通讯项目的一点心得 1.11 Hibernate源码研究碎得整理(一到十三)1.12 解决万恶的大数问题 1.13 ...

    Java基础知识点总结.docx

    无论是工作学习,不断的总结是必不可少的。只有不断的总结,发现问题,弥补不足,才能长久的...java.util.concurrent.locks包下常用的类 326 NIO(New IO) 327 volatile详解 337 Java 8新特性 347 Java 性能优化 362

    [Java参考文档]

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

    [Java参考文档].JDK_API 1.6

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

    22 尚硅谷Java JUC线程高级视频

    教程视频:在 Java 5.0 提供了 java.util.concurrent(简称JUC)包,在此包中增加了在并发编程中很常用的工具类, 用于定义类似于线程的自定义子系统,包括线程池,异步 IO 和轻量级任务框架;还提供了设计用于多线程上下文...

    JDK_1_6 API

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

    java 面试题 总结

    JAVA相关基础知识 1、面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用...

    超级有影响力霸气的Java面试题大全文档

    超级有影响力的Java面试题大全文档 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。...

    通俗易懂的JUC线程高级教程(含配套资料)

    本Java视频主要讲授Java JUC线程部分的内容:针对 Java 5.0 提供的 java.util.concurrent (简称 JUC )包中的线程的高级应用。 在此包中增加了在并发编程中常用的实用工具类,用于定义类似于线程的自定义子系统,...

Global site tag (gtag.js) - Google Analytics