futureTask RunnableFuture Future 三者关系认知

本文详细剖析FutureTask与ExecutorService协作,通过实例演示Future.get()获取结果的机制,解释为何submit返回null及多任务执行顺序。涉及的关键步骤包括任务提交、线程池调度与执行。

对于这三者首先我们看下源码,之后在分别写几个demo讲解下用法:

public interface RunnableFuture<V> extends Runnable, Future<V> {
     void run();
}

public class FutureTask<V> implements RunnableFuture<V> {}

public interface Future<V> {
    boolean cancel(boolean mayInterruptIfRunning);
    V get(long timeout, TimeUnit unit)throws InterruptedException, ExecutionException, TimeoutException;
    V get() throws InterruptedException, ExecutionException;
 }
    

 关系一目了然,我们首先使用下FutureTask  ,下面简单写一个demo

  FutureTask<Boolean> futureTask = new FutureTask<>(() -> false);
        ExecutorService executor = Executors.newSingleThreadExecutor();
        Future<Boolean> future = (Future<Boolean>) executor.submit(futureTask);
        try {
            System.out.println("future:"+future.get());
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
        try {
            boolean rs = futureTask.get(1, TimeUnit.MINUTES);
            System.out.println(rs);
        } catch (InterruptedException e) {
            System.out.println("执行被中断");
            e.printStackTrace();
        } catch (ExecutionException e) {
            System.out.println("执行过程出错");
            e.printStackTrace();
        } catch (TimeoutException e) {
            System.out.println("时间超时");
            e.printStackTrace();
        }finally {
            executor.shutdown();
        }
    }

 输出结果:

future:null
false

为什么  Future<Boolean> future = (Future<Boolean>) executor.submit(futureTask); 拿不到执行结果呢, 我们知道 executor.submit()如果执行的是runable接口方法返回值是null,下面改写下代码:

  FutureTask<Boolean> futureTask = new FutureTask<>(() -> false);
        ExecutorService executor = Executors.newSingleThreadExecutor();

        Future<Boolean> future = executor.submit(() -> true);
        executor.execute(futureTask);
        executor.submit(futureTask);
        try {
            System.out.println("future:"+future.get());
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
        try {
            boolean rs = futureTask.get(3, TimeUnit.SECONDS);
        
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员路同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值