我想从单元测试中检查未来是否已完成或取消,并且仍未在消耗CPU资源的后台运行。 一种方法是在我开始测试方法之前和之后检查期货数量。最好的方法是什么?
答案 0 :(得分:1)
您可以使用Thread.getAllStackTraces
至get 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"
)
})
}
}
这将在上面的应用中产生两个线程的状态,
输出:
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使用情况和所有信息。