java future获取线程异步执行的结果

是什么?为什么?怎么做?

 

一、是什么

Future是java.util.concurrent包提供的一个接口,用来获取线程异步执行的结果。

Future提供了检查异步执行的程序是否已经执行完毕、是否已经被取消,并且获取执行结果的方法。

我们可以使用Future来获取线程的状态,以及执行完成之后的结果。

二、为什么

在使用future之前,我们是如何获取线程异步执行的结果的?

举个简单例子:

我想到的一个方法是写一个变量,确认线程执行完后,读变量的值,就能获取线程的结果了(使用get方法或者换成共享变量直接读都可以)。

这里有几个问题:

1.要确保线程执行完毕,才能确定拿到的变量值是正确的

所以在这里使用join方法。

2.不知道当前线程的状态

当前线程是否执行完毕?任务是否被取消?我们没办法知道,也就没办法根据线程的状态采取不同的操作了。

如果使用future,就能更好地获取线程的状态,获取线程执行完毕后的结果。

三、怎么做

提到future就不能不提到callable,这两个接口经常在一起出现,配合使用。

callable接口类似于runnable,但是runnable不会返回结果,并且无法抛出返回结果的异常。callable功能更强大一些,被线程执行后,可以返回值,这个返回值可以被future拿到。

我的理解:

线程执行实现了callable接口的线程对象后,可以返回一个返回值。这个返回值可以被future拿到,这就实现了futrue获取线程异步执行的结果的效果。

1.简单例子

在这里,先写了一个实现callable接口的线程类:

同时实现一个futureTask对象,用于线程执行完后获取结果:

然后正常创建线程,执行线程:

使用get方法获取线程执行的结果:

在get获取结果之前(即线程还没有执行完),当前线程会在get方法处被阻塞。直到线程执行完毕,get获取结果之后,线程才能继续运行(在这里,如果主线程没有被阻塞,“end”肯定会提前输出)。

输出结果为:

2.复杂一点的例子

给出一个情景:

老师让三个学生做一道题,每隔一段时间看看学生做完没有,如果学生没做完,就提醒一下做题方法,如果学生做完了,就拿给老师检查。

需要注意的是isDone方法的使用。通过这个方法可以获知futrue是否已经获取结果(即异步线程是否已经执行完毕),就可以根据线程执行的状况采取更多的操作(比如记录进度什么的)

运行结果:

四、总结

如果需要获得线程异步执行的结果,那就使用Future吧。