java concurrent包中任务执行框架分析
提到java并发编程必然绕不过java的线程和任务接口;那么,构建java多线程程序,必然需要使用到Thread类和Runnable接口;此处,只考虑异步任务创建、线程创建与启动,暂时不考虑线程互斥和同步、线程安全等;看看通常异步任务创建与线程创建、启动,通常使用两种方式创建任务、并启动线程执行任务:
方式一:继承Thread,重写run方法
class Task extends Thread{@Overridepublic 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 {@Overridepublic void run() {//do something}public static void main(String[] args) throws InterruptedException, IOException {Thread thread = new Thread(new Task());thread.start();Thread.sleep(1000);}}
从示例观察,整个线程创建、执行存在一下问题:
再来看看java.util.concurrent包,对于上述问题,新的并发框架都给出了很不错的解决方案,提供了一下几个职责模型:
此外,还提供了定时任务执行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;如果需要深入线程管理与调度、任务管理可以深入分析这两个类的实现
?
?