【问题标题】:how to measure scala thread pool time?如何测量scala线程池时间?
【发布时间】:2017-01-24 09:58:48
【问题描述】:

您好,我想知道如何在 scala 中测量线程池时间。

这是一个例子。

val pool = java.util.concurrent.Executors.newFixedThreadPool(2)

val start_time = System.nanoTime()
1 to 10 foreach { x =>
  pool.execute(
    new Runnable {
      def run {
        try{
            Thread.sleep(2000)
            println("n: %s, thread: %s".format(x, Thread.currentThread.getId))
        }finally{
            pool.shutdown()
        }
      }
    }
  )
}
val end_time = System.nanoTime()

println("time is "+(end_time - start_time)/(1e6 * 60 * 60))

但我认为这不能正常工作。

有什么方法可以测量时间吗?

【问题讨论】:

  • 什么是“线程池时间”?
  • 线程池时间是指总运行时间。如果我在这段代码中使用 end_time 和 start_time,时间的结果就不能正常工作。
  • 那你为什么叫它线程池时间而不是总运行时间?
  • 很抱歉造成混乱。

标签: multithreading scala threadpool


【解决方案1】:

你的 sn-p 中有很多线程。

  • 您已在其中创建固定线程池并执行循环的主线程。
  • 10 个线程“休眠”了 2 秒并打印了一些内容。

您的主线程在创建 10 个线程后立即完成其工作并打印时间。它不会等待所有并行线程完成。 你要做的是等待所有线程的结果,然后才执行总时间计算。

我建议你了解一下Future 的概念,这将使你能够正确地等待结果。

所以您的代码可能如下所示:

    import scala.concurrent.ExecutionContext.Implicits.global
  import scala.concurrent._
  import scala.concurrent.duration.Duration

val start_time = System.nanoTime()
val zz = 1 to 10 map { x =>
  Future {
    Thread.sleep(2000)
    println("n: %s, thread: %s".format(x, Thread.currentThread.getId))
  }
}
Await.result(Future.sequence(zz), Duration.Inf)

val end_time = System.nanoTime()

println("time is " + (end_time - start_time) / (1e6 * 60 * 60))

我使用了默认的全局 Scala 线程池。

【讨论】:

  • 感谢您的回复!你能再回答一个问题吗?如果你不介意?当我在 spark-shell 中使用你的代码时,我得到了这样的错误。 error: object java.util.concurrent.Future is not a value Future { error: not found: value Duration Await.result(Future.sequence(zz), Duration.Inf) 未来值是多少?
  • 我要导入import scala.concurrent.Future吗??
  • 向示例添加了导入。应该可以在任何 Scala 控制台中正常工作。
  • 谢谢!成功了!这真的是我最后一个问题,难道不能用线程池来测量运行时间吗?
  • 我假设“使用线程池”是指由 Java API 而不是 Scala API 创建的线程池。是的,这是可能的 - 学习如何在 Java 中使用 Future 并使用相同的概念来等待结果,但全部使用 Java stackoverflow.com/questions/19348248/…
猜你喜欢
  • 2015-02-20
  • 2021-05-17
  • 2011-02-16
  • 2015-01-31
  • 1970-01-01
  • 1970-01-01
  • 2017-12-08
  • 2021-05-05
  • 2017-12-01
相关资源
最近更新 更多