简单了解下Callable接口的使用

首先要知道Thread类初始化时是不接受Callable类型来作为参数的,看看源码验证下:

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

发现Thread类初始化时只接受Runnable类型的参数。

那如果想用Callable类型的话怎么办呢,有个FutureTask可以提供帮助,先看看它的部分源码:

public class FutureTask<V> implements RunnableFuture<V> {
 //构造方法支持Callable类型
 public FutureTask(Callable<V> callable) {
        if (callable == null)
            throw new NullPointerException();
        this.callable = callable;
        this.state = NEW;       // ensure visibility of callable
    }
}

public interface RunnableFuture<V> extends Runnable, Future<V> {
}

看看上面的源码,以及继承关系,可以发现FutureTask是Runnable的子类,那么在Thread类初始化时传入FutureTask类肯定是不会出现编译报错的,该类型也是被允许的,同时FutureTask也有相应
Callable类型的构造方法。

使用FutureTask来间接使用Callable接口的示例代码:

 public static void main(String[] args) throws Exception {
        FutureTask future = new FutureTask(new Callable() {
            @Override
            public Object call() throws Exception {
                return "Callable";
            }
        });
        new Thread(future).start();
        System.out.println(future.get());
    }

输出结果如下:
在这里插入图片描述

总结

可以发现成功的使用了Callable类型来获得了线程运行的返回值。

原创文章 358 获赞 387 访问量 7万+

猜你喜欢

转载自blog.csdn.net/weixin_38106322/article/details/105676497