在执行上下文中使期货数量在后台运行的最佳方法是什么?

时间:2018-10-07 17:38:40

标签: scala

我想从单元测试中检查未来是否已完成或取消,并且仍未在消耗CPU资源的后台运行。 一种方法是在我开始测试方法之前和之后检查期货数量。最好的方法是什么?

1 个答案:

答案 0 :(得分:1)

您可以使用Thread.getAllStackTracesget the threads and their states之类的简单内容。 scala Future也将在线程上运行。

import java.lang.management.ManagementFactory

import scala.concurrent.ExecutionContext

object ThreadUsage {

  def main(args: Array[String]): Unit = {
    val ex = ExecutionContext.Implicits.global

    ex.execute(new Thread(() => {
      println("executing timed task")
      Thread.sleep(2000)
    }))

    // equivalent Future {}
    // import scala.concurrent.Future
    // Future {
    //  println("executing timed task")
    //  Thread.sleep(2000)
    // } (ex)

    ex.execute(new Thread(() => {
      println("executing quick task")
    }))

    val running = Thread.getAllStackTraces.keySet()
    running.forEach(a => {
      val bean = ManagementFactory.getThreadMXBean
      println(a.getThreadGroup + "   " + 
              a.getName + "   " + 
              a.getState + "   " +   
              (bean.getCurrentThreadCpuTime / (1000 * 1000)) + "ms"
      )
    })
  }
}

这将在上面的应用中产生两个线程的状态,

  • scala-execution-context-global-12
  • scala-execution-context-global-14

输出:

executing timed task
executing quick task
java.lang.ThreadGroup[name=main,maxpri=10]   scala-execution-context-global-14   WAITING   528ms
java.lang.ThreadGroup[name=system,maxpri=10]   Reference Handler   WAITING   528ms
java.lang.ThreadGroup[name=main,maxpri=10]   Monitor Ctrl-Break   RUNNABLE   528ms
java.lang.ThreadGroup[name=main,maxpri=10]   main   RUNNABLE   528ms
java.lang.ThreadGroup[name=main,maxpri=10]   scala-execution-context-global-12   TIMED_WAITING   528ms
java.lang.ThreadGroup[name=system,maxpri=10]   Signal Dispatcher   RUNNABLE   528ms
java.lang.ThreadGroup[name=system,maxpri=10]   Finalizer   WAITING   528ms

您可以改用jmc (java mission control)jconsole 之类的图形工具查看正在运行的线程及其CPU使用情况和所有信息。

相关问题