如何在sbt shell中运行测试后关闭线程

时间:2015-12-01 09:54:00

标签: scala sbt

我正在使用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 ...

如何确保它们被停止?

1 个答案:

答案 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)