我正在使用sbt 0.13.9和scalatest。该项目包含一堆守护程序线程。简化示例:
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
}
有些测试使用Storage
。在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 ...
如何确保它们被停止?
答案 0 :(得分:0)
看起来daemon threadFactory用于创建Runnable
任务,但调度程序本身在普通/非守护程序线程池上执行。
作为一种选择。
安排完任务后,您应该ScheduleFuture
并处理它。例如,在执行某些操作后cancel
。
val fff = scheduler.scheduleAtFixedRate(new Runnable {
override def run(): Unit = {
println("Running ...")
// do something
}
}, 0, 10, TimeUnit.SECONDS)
fff.cancel(true)