据我了解,Guava 的 MoreExecutors.directExecutor() 创建了一个 Executor,它将在执行方法调用返回之前执行可运行对象。
哪些用例需要直接执行器?调用者不能直接调用 runnable.run() 来直接调用 runnable.run() 而不是通过创建执行器并将 runnable 提交给该执行器来进行额外的间接级别吗?也许我错过了它存在的真正目的。我想了解这在什么情况下有用。
很少有地方同时需要
Runnable
和Executor
。
其中之一是例如
ListenableFuture
及其 addListener
方法。如何在同一线程中立即执行侦听器的唯一方法是提供直接执行器。
MoreExecutors.directExecutor()
非常有用(例如 Futures.transform()
、listenableFuture.addListener()
等)。
请注意,当您将
directExecutor()
与这些 API 一起使用时,可运行程序可能会在这两个线程之一上运行:
transform()
/addListener()
这种不确定性可能会导致意想不到的问题。所以使用时要小心
directExecutor()
。
使用 Java 8+,我们可以将
Runnable::run
代替 MoreExecutors.directExecutor()
传递给 ListenableFuture.addListener 或 Futures.transform
方法,并且行为将是相同的。