实现线程的第三种方式:
实现Callable接口。(JDK新特性)
这种方式的优点:可以获取到线程的执行结果
这种方式的缺点:效率比较低,在获取t线程执行结果的时候,当前线程受阻塞,效率较低
这种方式实现的线程可以获取线程的返回值。之前讲解的那两种方式是无法获取线程返回值的,因为run方法返回void.
思考:
系统委派一个线程去执行一个任务,该线程执行完任务之后,可能会有一个执行结果,我们怎么能拿到这个执行结果呢?
使用第三种方式:实现Callable接口方式。
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask; //JUC包下的,属于java的并发包,老JDK中没有这个包。新特性。
public class ThreadTest15{
public static void main(String[] args){
//第一步:创建一个”未来任务类“对象
//参数非常重要,需要给一个Callable接口实现类对象
FutureTask task = new FutureTask((new Callable(){
public Object call() throws Exception{ //call方法就相当于run方法,只不过这个有返回值
//线程执行一个任务,执行之后可能会有一个执行结果
//模拟执行
System.out.println("call method begin");
Thread.sleep(1000*10);
System.out.println("call method end!");
int a=100;
int b=200;
return a+b; //自动装箱(300结果变成Integer)
}
});
//创建线程对象
Thread t = new Thread(task);
//启动线程
t.start();
//这里是main方法,这是在主线程中。
//在主线程中,怎么获取t线程的返回结果?
//get()方法的执行会导致”当前线程阻塞“
Object obj = task.get();
System.out.println("线程执行结果:"+obj);
//main方法这里的程序要想执行必须等待get()方法的结束
//而get()方法可能需要很久,因为get()方法是为了拿另一个线程的执行结果
//而另一个线程执行是需要时间的。
System.out.println("hello world");
}
}