如何衡量scala线程池时间?

时间:2017-01-24 09:58:48

标签: multithreading scala threadpool

嗨,我想知道如何在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))

但我认为这样做不正常。

有没有什么方法可以衡量时间?

1 个答案:

答案 0 :(得分:1)

您的代码段中有许多主题。

  • 主线程,您已经创建了固定线程池并执行循环。
  • "睡觉" 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线程池。