Java创建线程 为什么Callable需要FutureTask包装一下?

Java创建线程 为什么Callable需要FutureTask包装一下?


1、首先通过Callable接口创建线程的Demo如下:

//1、定义一个类MyCallable实现Callable接口重写call方法,泛型为返回值类型
class MyCallable implements Callable<Integer> {
    @Override
    public Integer call() throws Exception {
        return 1;
    }
    
    public static void main(String[] args) throws ExecutionException, InterruptedException {
    	//创建MyCallable类的实例
        MyCallable myCallable = new MyCallable();
        //通过FutureTask包装MyCallable类的实例,泛型为返回值类型
        FutureTask<Integer> f = new FutureTask<Integer>(myCallable);
        //通过new Thread的方式,创建线程,并启动线程
        new Thread(f).start();
        //通过FutureTask的对象f获得最终线程执行后的返回值,该返回值可用于另一线程,这里可以用于主线程
        System.out.println(f.get());// 最终结果输入1
    }
}

2、查看接口Callable的源码

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

通过上面源码可以发现,Callable接口有一个泛型作为返回值除此之外没有任何继承或者实现关系

3、查看FutureTask类的构造方法

    public FutureTask(Callable<V> callable) {
        if (callable == null)
            throw new NullPointerException();
        this.callable = callable;
        this.state = NEW;       // ensure visibility of callable
    }

通过上面源码可以发现,Callable接口可以构造FutureTask类的对象

3、查看FutureTask类的结构

在这里插入图片描述

从该结构可以看出,FutureTask是一个类(抽象类),因此FutureTask实现Runnable接口

4、查看Thread类的构造方法

  public Thread(Runnable target) {
        init(null, target, "Thread-" + nextThreadNum(), 0);
    }

​ 从该构造方法可以看出,参数是一个Runnable,那么可以分析得到:

  • 首先可以通过FutureTask的构造方法,传入Callable接口的实例,构造FutureTask对象

  • 由于FutureTask间接实现了Runnable接口,同时Thread类的构造方法要求放入一个Runnable,这时候就可以放入当前构造的FutureTask对象

  • 最后通过Threadstart()方法开启一个线程

​ 最后再次贴上文章开头的代码,结合上面的分析,方便理解:

        //创建MyCallable类的实例
        MyCallable myCallable = new MyCallable();
        //通过FutureTask包装MyCallable类的实例,泛型为返回值类型
        FutureTask<Integer> f = new FutureTask<Integer>(myCallable);
        //通过new Thread的方式,创建线程,并启动线程
        new Thread(f).start();
        //通过FutureTask的对象f获得最终线程执行后的返回值,该返回值可用于另一线程,这里可以用于主线程
        System.out.println(f.get());// 最终结果输入1
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值