Scala 在sbt shell中运行测试后,如何关闭线程
我将sbt 0.13.9与scalatest一起使用。该项目包含一组守护进程线程。简化示例:Scala 在sbt shell中运行测试后,如何关闭线程,scala,sbt,Scala,Sbt,我将sbt 0.13.9与scalatest一起使用。该项目包含一组守护进程线程。简化示例: object Storage { private lazy val scheduler = Executors.newSingleThreadScheduledExecutor( new com.twitter.concurrent.NamedPoolThreadFactoryNamedPoolThreadFactory("thread-name", true) ) schedul
object Storage {
private lazy val scheduler = Executors.newSingleThreadScheduledExecutor(
new com.twitter.concurrent.NamedPoolThreadFactoryNamedPoolThreadFactory("thread-name", true)
)
scheduler.scheduleAtFixedRate(new Runnable {
override def run(): Unit = {
println("Running ...")
// do something
}
}, 0, 1, TimeUnit.MINUTES)
// other code
}
有些测试使用存储
。在SBT shell中运行test
时,我可以看到Runnable
在所有测试完成后仍在运行
[info] All tests passed.
[success] Total time: 32 s, completed Dec 1, 2015 10:39:57 AM
> 2015-12-01 10:40:51,806 INFO Storage$$anon$1 - Running ...
2015-12-01 10:41:51,810 INFO Storage$$anon$1 - Running ...
如何确保它们已停止?看起来daemon threadFactory用于创建
Runnable
任务,但调度程序本身是在正常/非daemon线程池上执行的
作为一种选择。
在安排任务后,您应该采取schedulefourture
并处理它。例如,执行一些操作后,取消
val fff = scheduler.scheduleAtFixedRate(new Runnable {
override def run(): Unit = {
println("Running ...")
// do something
}
}, 0, 10, TimeUnit.SECONDS)
fff.cancel(true)
如果将
true
作为秒参数发送,则在NamedPoolThreadFactory
中已经完成了此操作。我已经查看了我的答案。调度程序是从测试线程创建的。测试实例化一个包含调度程序的对象。我无法取消ScheduledFuture
,因为这是一项定期任务。