来自Java背景,我最近开始在我的工作所需的Scala编码。Runnable和Future在Scala之间有什么区别?
我已阅读the concurrency guide for Scala并知道如何使用未来来执行异步任务。
我想知道:
如果异步任务,我想执行没有返回值,是否有使用可运行提交给一个线程,并单独使用一个未来有什么区别?
与runnable相比未来的性能如何?还是我比较苹果和橙色?
来自Java背景,我最近开始在我的工作所需的Scala编码。Runnable和Future在Scala之间有什么区别?
我已阅读the concurrency guide for Scala并知道如何使用未来来执行异步任务。
我想知道:
如果异步任务,我想执行没有返回值,是否有使用可运行提交给一个线程,并单独使用一个未来有什么区别?
与runnable相比未来的性能如何?还是我比较苹果和橙色?
Future
(scala.concurrent.Future
,不要与Scalaz中的问题混淆)使用下面的Runnable
来实现 - 请参见PromiseCompletingRunnable
。在很多方面,它只是一个包装,提供了很好的高级功能(特别是使用flatMap
)。因此,行为和性能非常相似 - Future
将非常轻微性能比“原始”Runnable
性能差,因为它涉及实例化更多的包装类,但在实践中,如果将来做任何事情,这不太可能会引起注意实际工作(特别是如果运行它涉及创建一个新线程)。如果您创建了Future[Unit]
并将其丢弃,这与创建Runnable
并将其提交给相同的ExecutionContext
确实非常相似。
我期待未来类似于runnable莫名其妙。是否有任何参考状态表明未来可以在下面使用?另外,如果它是一个封装的可运行的应用程序,将来如何实现返回值呢? – user2829759
我没有任何参考,只是看标准库源。值通过'Promise'返回;当你创建一个Future时,实际的实现是1.创建一个Promise 2.创建一个PromiseCompletingRunnable来完成你给它的计算然后用它完成Promise 3.提交PromiseCompletingRunnable到'ExecutionContext' 4.返回'Promise'。 – lmm
Future是运行异步(它是monad)的东西的'容器'。
所以,你得到一个工具箱来处理计算结果/失败。
你看过这个:http://docs.scala-lang.org/overviews/core/futures.html?
苹果橙色,是的。这两件事并非完全可以互换。 – biziclop
@Duncan这正是我发生的事情。 :) – biziclop
@Duncan有道理:) – user2829759