伙伴们,又见面了,我们接着聊java多线程实现方式,上篇我们介绍了可以通过实现Runnable接口来实现多线程,但是会发现实现Runnable接口的方式执行run方法之后没有返回值,如果我们想获取执行之后的返回值呢,那么我们可以通过今天介绍的实现Callable接口的方法。首先看下Callable接口的源码:
@FunctionalInterface public interface Callable{ V call() throws Exception; }
通过@FunctionalInterface可以看出它是一个函数式接口,接收一个泛型作为返回值类型。对比下Runnable接口的源码:
@FunctionalInterface
public interface Runnable {
//没有返回值
public abstract void run();
}
可以发现Callable接口中call方法不仅可以有返回值还可以抛出异常,而Runnable接口中run方法没有返回值并且不能往外抛出异常。举个Callable接口的栗子:
public class CallableTest implements Callable{ @Override public String call() throws Exception { //返回线程名 return Thread.currentThread().getName(); } public static void main(String[] args) throws ExecutionException, InterruptedException { CallableTest callableTest = new CallableTest(); FutureTask futureTask = new FutureTask(callableTest); new Thread(futureTask,"callTest").start(); System.out.println(futureTask.get()); } }
栗子中我们传递了String类型作为call方法的返回值,接下来我们看看main方法中的写法。
首先看下FutureTask的源码:
public class FutureTaskimplements RunnableFuture { //其中一个构造方法 public FutureTask(Callable callable) { if (callable == null) throw new NullPointerException(); this.callable = callable; this.state = NEW; } ...... }
从中我们可以通过实现Callable接口的对象来创建FutureTask对象,FutureTask
public interface RunnableFutureextends Runnable, Future { void run(); }
可见它继承了Runnable和Future
//可以给线程设置名称的构造方法
public Thread(Runnable target, String name) {
init(null, target, name, 0);
}
public Thread(Runnable target) {
init(null, target, "Thread-" + nextThreadNum(), 0);
}
总结一下:在Thread类中有Runnable接口类型参数的构造方法,在上面的栗子中FutureTask



