scala - 在执行上下文中获得在后台运行的期货数量的最佳方法是什么?
问题描述
我想从单元测试中检查未来是否已完成或取消并且仍然没有在后台运行消耗 cpu 资源。一种方法是在我开始测试方法之前和之后检查期货的数量。最好的方法是什么?
解决方案
您可以使用简单的方法Thread.getAllStackTraces
来获取线程及其状态。scalaFuture
也将在线程上运行。
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 任务控制)之类的图形工具,并jconsole
查看正在运行的线程及其 CPU 使用率等。
推荐阅读
- python - 使用来自 Python 的 boost 定义的 C++ 虚函数
- python - 最大值的二进制向量
- php - 如何正确使用 mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
- r - R中where子句中的特殊字符(')
- vue.js - 如何链接到 vue.js 中的 html 页面?
- android - AppCompatActivity 如何使用 EventBus 与 FragmentActivity 进行通信?
- php - 分配函数不要将数组分配给对象
- spring-boot - 如何将外部页面添加到文件jsp?
- python - Pandas Groupby 并将自定义函数应用于该组中列的每 N 行
- python - SQL 数据库不显示条目