FutureTask实现先执行任务,后获取结果

1、实现Callable接口来创建线程的方式,可以拿到线程执行结果,结果包含正常执行完成返回的结果,或者发生异常时抛出的异常信息。Callable与Runnable的主要差异就是Runnable的run方法没有返回值,且不抛出异常,Callable的call方法有返回值且可以抛出异常。

2、Future接口中定义了get方法,用来获取线程执行结果的返回值;RunnableFuture接口继承了Future和Runnable,FutureTask实现了RunnableFuture接口,RunnableFuture有入参为Callable类型的构造方法,使用get方法可以获取执行结果。

3、RunnableFuture的get方法为阻塞方法,在线程已执行完成(正常结束,或抛出异常)时,可直接获取执行结果,如果线程未执行完成,则进入阻塞,等待线程执行完成。

4、代码如下:

public class Preloader {
    ProductInfo loadProductInfo() throws DataLoadException {
        return null;
    }

    private final FutureTask<ProductInfo> future =
        new FutureTask<ProductInfo>(new Callable<ProductInfo>() {
            @Override
            public ProductInfo call() throws DataLoadException {
                return loadProductInfo();
            }
        });
    private final Thread thread = new Thread(future);

    public void start() { thread.start(); }

    public ProductInfo get()
            throws DataLoadException, InterruptedException {
        try {
            return future.get();
        } catch (ExecutionException e) {
            Throwable cause = e.getCause();
            if (cause instanceof DataLoadException)
                throw (DataLoadException) cause;
            else
                throw LaunderThrowable.launderThrowable(cause);
        }
    }

    interface ProductInfo {
    }
}

class DataLoadException extends Exception { }
public class LaunderThrowable {

    /**
     * Coerce an unchecked Throwable to a RuntimeException
     * <p/>
     * If the Throwable is an Error, throw it; if it is a
     * RuntimeException return it, otherwise throw IllegalStateException
     */
    public static RuntimeException launderThrowable(Throwable t) {
        if (t instanceof RuntimeException)
            return (RuntimeException) t;
        else if (t instanceof Error)
            throw (Error) t;
        else
            throw new IllegalStateException("Not unchecked", t);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FutureTask是Java中Executor框架提供的一个实用工具类,用来表示一个异步计算的结果,其中包含了对任务执行状态以及返回结果的控制。FutureTask实现原理主要包括以下几个方面: 1. FutureTask内部有一个volatile修饰的state字段,用于表示任务执行状态。初始状态为NEW,表示任务还未开始执行;运行状态为RUNNING,表示任务正在执行中;完成状态为COMPLETING,表示任务已经执行完成但还未获取结果;NORMAL,表示任务正常执行完成;异常状态为EXCEPTIONAL,表示任务执行过程中发生异常。 2. FutureTask实现了Runnable和Future接口。在任务执行的过程中,通过重写Runnable接口的run方法来执行具体的任务逻辑,并将任务的结果保存在result字段中。因为实现Future接口,所以FutureTask可以通过get方法来获取任务执行结果,如果任务还未执行完成,则get方法会阻塞等待任务完成。 3. FutureTask使用AQS(AbstractQueuedSynchronizer)来实现任务执行控制。AQS是Java并发包中用于实现锁和同步器的基础类,通过实现AQS的子类Sync,来控制任务执行获取结果的过程。在任务执行过程中,通过CAS操作来更新任务执行状态,确保只有一个线程能够成功获取任务的结果。 4. FutureTask还支持任务的取消操作。在调用cancel方法时,会尝试将任务执行状态设置为CANCELLED,如果设置成功,则任务会被标记为已取消。取消任务时,如果任务已经在执行过程中,则会中断该任务执行线程。 总之,FutureTask通过内部的状态管理、AQS实现控制、Runnable和Future接口的实现实现了异步任务执行控制和结果获取功能,为多线程编程提供了更强大和便捷的支持。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值