实现多线程的第三种方式(实现Callable接口)
之前介绍了两种实现多线程的方式:继承Thread类和实现Runnable接口。但是这两种方式的线程都不能返回一个返回值,因为run()没有返回值。
但是有时候我们委派一个线程去执行一个任务,我们希望这个线程可以返回该任务的执行结果。
JDK8中推出了一种新的实现多线程的方式:实现Callable接口,该种方式可以获取线程的返回值。
例:
package com.dh.callable;
import java.util.concurrent.Callable;//Callable位于JUC并发包下
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class Thread01 {
public static void main(String[] args) {
//创建一个“未来任务类”对象,参数为实现Callable的类
FutureTask futureTask = new FutureTask(new MyThread());
//将该对象做为参数创建一个线程
Thread t = new Thread(futureTask);
t.setName("t");
t.start();
//获取线程的返回值
Object o = null;
try {
o = futureTask.get();//会阻塞,并且该方法可能要执行很久,因为要等待另外一个线程的执行结果
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
System.out.println(o);
System.out.println(Thread.currentThread().getName());
}
}
class MyThread implements Callable {
//相当于run(),但是call()有返回值
@Override
public Object call() throws Exception {
Thread.sleep(1000 * 10);
return Thread.currentThread().getName();
}
}
结果:
t
main
程序会先等待10s再输出t及main,并且t一定再main之前输出,因为get()会产生阻塞。