2015-12-01 60 views
0

我正在使用sbt 0.13.9和scalatest。該項目包含一堆守護進程線程。簡化示例:如何在sbt shell中運行測試後關閉線程

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

看起來像守護程序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) 
+0

如果您發送'true'作爲秒參數,那麼已經在'NamedPoolThreadFactory'中完成了。 – reikje

+0

我已閱讀我的答案。 – Rumoku

+0

調度程序是從測試線程創建的。測試實例化一個包含調度器的對象。我無法取消'ScheduledFuture',因爲這是一個循環任務。 – reikje