Future接口和实现Future接口的FutureTask类,代表异步计算的结果。FutureTask非常适合用于耗时的计算,主线程可以在完成自己的其他任务后,再去获取结果,而不必等待这个耗时的任务执行完再去做别的工作。
一、FutureTask简介
FutureTask除实现Future接口外,还实现了Runnable接口。因此,FutureTask(可以视为一个线程)可以交给Executor执行,也可以由调用线程直接执行(FutureTask.run())。根据FutureTask.run()方法被执行的时机,FutureTask可以处于下面3种状态。
1)未启动:FutureTask.run()方法还没有被执行之前,FutureTask处于未启动状态。当创建一个FutureTask,且没有执行FutureTask.run()方法之前,这个FutureTask处于未启动状态。
2)已启动:FutureTask.run()方法在执行的过程中,FutureTask处于已启动状态。
3)已完成:FutureTask.run()方法执行完后正常结束,或被取消(FutureTask.cancel(…)),或执行FutureTask.run()方法时抛出异常而异常结束,FutureTask处于已完成状态。
当FutureTask处于未启动或已启动状态时,执行FutureTask.get()方法将导致调用线程阻塞(等待当前线程或任务运行结束而返回结果或抛出异常);当FutureTask处于已完成状态时,执行FutureTask.get()方法将导致调用线程立即返回结果或抛出异常。
当FutureTask处于未启动状态:执行FutureTask.cancel()方法将导致此任务永远不会被执行;
当FutureTask处于已启动状态:执行FutureTask.can