【问题标题】:When scala.concurrent.Future's execution starts?scala.concurrent.Future 的执行何时开始?
【发布时间】:2015-10-29 00:48:43
【问题描述】:

当然可以在 Future 主体的第一行收集系统时间。但是:

是否有可能在没有访问未来代码的情况下知道那个时间。 (在我的情况下,返回未来的方法将由“框架”的用户提供。)

def f: Future[Int] = ...

def magicTimePeak: Long = ???

【问题讨论】:

    标签: scala future execution systemtime


    【解决方案1】:

    Future 本身并不真正了解这一点(也不是为了关心而设计的)。当代码真正被执行时,这一切都取决于执行者。这取决于线程是否立即可用,如果没有,何时可用。


    我想你可以包装 Future 来跟踪它。它将涉及创建一个底层Future,并使用一个闭包来更改包装类中的可变变量。由于您只需要Long,因此如果Future 尚未开始执行,则它必须默认为零,尽管将其更改为Option[Date] 或其他东西会很简单。

    class WrappedFuture[A](thunk: => A)(implicit ec: ExecutionContext) {
    
        var started: Long = 0L
    
        val underlying = Future {
            started = System.nanoTime / 1000000 // milliseconds
            thunk
        }
    
    }
    

    为了证明它有效,创建一个带有一个线程的固定线程池,然后为其提供一个阻塞任务,例如 5 秒。然后,创建一个WrappedFuture,稍后检查它的started 值。注意记录时间的差异。

    import java.util.concurrent.Executors
    import scala.concurrent._
    val executorService = Executors.newFixedThreadPool(1)
    implicit val ec = ExecutionContext.fromExecutorService(executorService)
    
    scala> println("Before blocked: " + System.nanoTime / 1000000)
    Before blocked: 13131636
    
    scala> val blocker = Future(Thread.sleep(5000))
    blocker: scala.concurrent.Future[Unit] = scala.concurrent.impl.Promise$DefaultPromise@7e5d9a50
    
    scala> val f = new WrappedFuture(1)
    f: WrappedFuture[Int] = WrappedFuture@4c4748bf
    
    scala> f.started
    res13: Long = 13136779 // note the difference in time of about 5000 ms from earlier
    

    但是,如果您不控制 Future 的创建,则无法确定它何时开始。

    【讨论】:

      猜你喜欢
      • 2015-01-06
      • 2022-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-12
      • 2017-11-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多