聊聊高并发(四十一)解析java.util.concurrent各个组件(十七) 任务的异步执行和状态控制

本文详细探讨了Java并发组件中的ExecutorService接口和FutureTask类,讲解了如何实现任务的异步执行以及状态控制。ExecutorService提供任务生命周期管理,支持异步和批量任务执行。Future接口用于控制异步任务,submit方法返回Future对象,允许对任务进行控制。FutureTask作为RunnableFuture的实现,包含了任务状态管理,如NEW、COMPLETING、NORMAL、EXCEPTIONAL、CANCELLED、INTERRUPTING和INTERRUPTED。构造函数支持Callable和Runnable,取消任务时可通过改变状态并中断线程实现。
摘要由CSDN通过智能技术生成

聊聊高并发(三十九)解析java.util.concurrent各个组件(十五) 理解ExecutorService接口的设计这篇说了ExecutorService接口扩展了Executor接口,在执行任务的基础上,提供了执行框架生命周期的管理,任务的异步执行,批量任务的执行的能力。AbstractExecutorService抽象类实现了ExecutorService接口,提供了任务异步执行和批量执行的默认实现。这篇说说任务的异步执行和状态控制

说明一点,使用Executor框架执行任务的方式基本都是异步执行的,交给线程池的线程来执行。ExecutorService在任务异步执行的基础上,通过Future接口来对异步执行的任务进行状态控制。


submit方法可以返回Future对象来对异步执行任务进行控制。submit方法有三种调用方式,传递Runnable, Runnable和result,Callable。

 public Future<?> submit(Runnable task) {
        if (task == null) throw new NullPointerException();
        RunnableFuture<Void> ftask = newTaskFor(task, null);
        execute(ftask);
        return ftask;
    }

    public <T> Future<T> submit(Runnable task, T result) {
        if (task == null) throw new NullPointerException();
        RunnableFuture<T> ftask = newTaskFor(task, result);
        execute(ftask);
        return ftask;
    }

    public <T> Future<T> submit(Callable<T> task) {
        if (task == null) throw new NullPointerException();
        RunnableFuture<T> ftask = newTaskFor(task);
        execute(ftask);
        return ftask;
    }

从submit的实现可以看到,都是使用了newTaskFor方法进行了接口的适配,返回一个RunnableFuture类型

protected <T> RunnableFuture<T> newTaskFor(Runnable runnable, T value) {
        return new FutureTask<T>(runnable, value);
    }

   
    protected <T> RunnableFuture<T> newTaskFor(Callable<T> callable) {
        return new FutureTask<T>(callable);
    }

来看一下对异步执行的任务进行控制的Future接口相关的类

1. Ruuable表示可被Thread执行的任务,它的run方法没有返回值,并且没有显式的异常

2. Callable表示可以调用的任务,它的call方法可以有返回值,可以抛出显式的异常

3. Future接口是对异步执行的任务的控制,包括取消任务,判断任务状态,获取任务结果等操作

4. RunnableFuture是对Runnable接口和Future接口的适配,表示可以被控制状态的Runnable

5. RunnableAdapter是对Runnable和Callalbe的适配,实现了Callable接口,并聚合了Runnable对象

6. FutureTask实现了RunnableFuture接口,通过RunnableAdapter对传入的Callable和Runnable参数进行统一处理



public interface Runnable {
    public abstract void run();
}

public interface Callable<V> {
    V call() throws Exception;
}

static final class RunnableA
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值