2022-04-01 Java FutureTask的异步执行分析

愚人节一记

今天编写FutureTask的例程,使用异步方式得到返回结果。代码如下:


代码很简单,使用Callable作为参数,通过Lambda的形式,新建一个FutureTask对象,启动执行线程后,等待FutureTask的输出结果。

这里解析一下,在其他文章里没有讲到的一些内容。

1. 异步实现原理及过程

先说结论:FutureTask利用了LockSupport的park() 和 unpark() 方法完成了异步过程的控制。

FutureTask 实现了接口RunnableFuture,间接的实现了Runnable接口。通过在自身的run()方法中调用我们写的Callable的call()方法,运行我们的代码逻辑。

由于FutureTask实现了Runnable接口,因此将它作为Thread的参数,可以启动新的线程执行。

FutureTask.run()中在执行完成call()方法后,将调用set(result)方法。此方法调用finishCompletion() ,其中使用LockSupport.unpark(t)发放Permit。使阻塞方法FutureTask.get()方法得以继续执行。


FutureTask.set()方法中通过finishCompletion() 使用了LockSupport.park()方法等待Permit。



你可能感兴趣的:(2022-04-01 Java FutureTask的异步执行分析)