首先要知道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类型来获得了线程运行的返回值。