java FutureTask在线程执行器中控制任务的完成

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

 

一、是什么

FutureTask类提供了一个名为done的方法,允许在执行器中的任务执行完毕得到结果之后,还可以执行一些代码。

这个方法可以被用来执行一些后期处理操作,比如:产生报表、通过邮件发送结果、释放一些系统资源。当任务执行完成并且受FutureTask类控制时,这个方法将在内部被FutureTask类调用。

任务得到结果之后/任务的状态已改变为isDone之后,不管任务是被取消还是正常结束,done方法都会被被调用。

二、为什么

有这样的情景:

任务执行完后,我想要记录日志、保存结果、发送通知…这些方法都是可以重用的,所以不方便写在任务之中,而是等待任务执行完成之后,再想办法执行这些方法。

所以,FutureTask类提供了done方法来实现这个情景。线程执行器执行完任务之后,就会调用我们自定义的done方法,实现想要的操作。

三、怎么做

1.简单例子

运行结果:

如果在获取结果之前取消执行任务:

运行结果:

以前我们使用线程执行器的时候,都是直接执行线程类:

但是这次我们把线程类包装成了一个FutureTask,在FutureTask中重写了done方法,决定了任务完成之后要执行什么操作(其实就是在线程类外面加了一个包装,获取任务执行的信息,决定任务执行后的操作):

如果任务被取消了,那么就syso被取消的信息。如果没有被取消,那么就syso任务正常完成的信息。

之后在主线程中正常执行任务,主线程会阻塞在get方法处,直到任务完成为止。

2.如果任务报错

如果在线程类中抛出一个错误:

运行结果:

get方法会报错。

3.复杂一点的例子

同时开启5个任务:

运行结果:

四、总结

重点在于FutureTask包装类,基本上所有实现都可以参照上面的例子。