在前面的文章中我们讲述了创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口。
这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果。
而自从Java 1.5开始,就提供了Callable和Future,通过它们可以在任务执行完毕之后得到任务执行结果。今天我们就来讨论一下Callable、Future和FutureTask三个类的使用方法。
一、Callable与Runnable
1、先说一下java.lang.Runnable吧,它是一个接口,在它里面只声明了一个run()方法:
@FunctionalInterface
public interface Runnable {
public abstract void run();
}
由于run()方法返回值为void类型,所以在执行完任务之后无法返回任何结果。
2、Callable位于java.util.concurrent包下,它也是一个接口,在它里面也只声明了一个方法,只不过这个方法叫做call()。
@FunctionalInterface
public interface Callable<V> {
V call() throws Exception;
}
这是一个泛型接口,call()
函数返回的类型就是传递进来的V
类型。
二、 Future
1、Future
就是对于具体的Runnable<