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;如果需要深入线程管理与调度、任务管理可以深入分析这两个类的实现

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值