java多线程编程同步器的未来和FutureTask解析及代码示例

  

<代码> publicinterfaceFuture未来表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并获取计算的结果。计算完成后只能使用得到方法来获取结果,如有必要,计算完成前可以阻塞此方法。取消则由取消方法来执行。还提供了其他方法,以确定任务是正常完成还是被取消了。一旦计算完成,就不能再取消计算。如果为了可取消性而使用未来但又不提供可用的结果,则可以声明Future<& # 63;在形式类型,并返回零作为底层任务的结果。

  

  

1) <代码> booleancancel (booleanmayInterruptIfRunning): 试图取消对此任务的执行。如果任务已完成,或已取消,或者由于某些其他原因而无法取消,则此尝试将失败。当调用取消时,如果调用成功,而此任务尚未启动,则此任务将永不运行。如果任务已经启动,则mayInterruptIfRunning参数确定是否应该以试图停止任务的方式来中断执行此任务的线程。此方法返回后,对结束()的后续调用将始终返回正确的。如果此方法返回真,则对isCancelled()的后续调用将始终返回真的。

  

2) <代码> booleanisCancelled():>   

3) <代码> booleanisDone():>   

4) <代码> Vget () throwsInterruptedException ExecutionException>   

5) <代码> Vget (longtimeout, TimeUnitunit) throwsInterruptedException中TimeoutException>   


  

  

Future接口是用来获取异步计算结果的,说白了就是对具体的Runnable或者可调用的对象任务执行的结果进行获取(get()),取消(取消()),判断是否完成等操作。我们看看未来的接口的源码:

        公共接口Future{   布尔取消(布尔mayInterruptIfRunning);   布尔isCancelled ();   布尔结束();   V get()抛出InterruptedException, ExecutionException;   V获得(长超时,TimeUnit unit)抛出InterruptedException,中TimeoutException;   }      

方法解析:

  

Vget():获取异步执行的结果,如果没有结果可用,此方法会阻塞直到异步计算完成。

  

Vget (Longtimeout TimeUnitunit):获取异步执行结果,如果没有结果可用,此方法会阻塞,但是会有时间限制,如果阻塞时间超过设定的超时时间,该方法将抛出异常。

  

booleanisDone():如果任务执行结束,无论是正常结束或是中途取消还是发生异常,都返回真的。

  

booleanisCanceller():如果任务完成前被取消,则返回真的。

  

booleancancel (booleanmayInterruptRunning):如果任务还没开始,执行取消(…)方法将返回假;如果任务已经启动,执行取消(真正的)方法将以中断执行此任务线程的方式来试图停止任务,如果停止成功,返回正确的;当任务已经启动,执行取消(false)方法将不会对正在执行的任务线程产生影响(让线程正常执行到完成),此时返回假;当任务已经完成,执行取消(…)方法将返回false.mayInterruptRunning参数表示是否中断执行中的线程。

  

通过方法分析我们也知道实际上未来提供了3种功能:(1)能够中断执行中的任务(2)判断任务是否执行完成(3)获取任务执行完成后额结果。

  

但是我们必须明白未来只是一个接口,我们无法直接创建对象,因此就需要其实现类FutureTask登场啦。

  

  

FutureTask可用于异步获取执行结果或取消执行任务的场景。通过传入Runnable或者可调用的任务给FutureTask,直接调用其运行方法或者放入线程池执行,之后可以在外部通过FutureTask的得到方法异步获取执行结果,因此,FutureTask非常适合用于耗时的计算,主线程可以在完成自己的任务后,再去获取结果。另外,FutureTask还可以确保即使调用了多次运行方法,它都只会执行一次Runnable或者可调用的任务,或者通过取消取消FutureTask的执行等。

  

我们来看看FutureTask的实现

        公开课FutureTask实现RunnableFuture{      

FutureTask类实现了RunnableFuture接口,我们看一下RunnableFuture接口的实现:

        公共接口RunnableFuture扩展了Runnable, Future{   空运行();   }      

java多线程编程同步器的未来和FutureTask解析及代码示例