2016-02-19 27 views
1

像下面這樣的未來是否會實現新線程?顯然它不是(見下面的輸出)。爲什麼?如果我想讓我的代碼在新線程上運行,該怎麼辦?未來會有新線程嗎?

package MyTest 

import com.twitter.util._ 

import scala.language.postfixOps 

object Test { 

    def test1 = Future { 
    println("BeforeTest", Thread.currentThread()) 
    Thread.sleep(5000) 
    println("AfterTest", Thread.currentThread()) 
    } 

    def test2 = test1 onSuccess { case _ => println("Future on success") } 

    def main(args: Array[String]): Unit = { 

    println("main", Thread.currentThread()) 
    test2 
    println("main123", Thread.currentThread()) 
    } 
} 

輸出:

(主,線程[運行主0,5,運行主基團的0])

(BeforeTest,線程[運行main- 0,5,運行主基團的0])

(AfterTest,線程[運行主0,5,運行主基團的0])

未來上成功

(main123,螺紋[運行主0,5,運行主族-0])

回答

3

您使用的是twitter期貨,而不是scala期貨。 默認情況下,Twitter期貨不是多線程的。 你必須使用一個FuturePool(傳遞一個ExecutorService的與您所選擇的線程池)

未測試的例子(很簡單的工作,我希望:)):

val executor = Executors.newFixedThreadPool(4) 
val pool = FuturePool(executor) 

def test1 = pool { 
    println("BeforeTest", Thread.currentThread()) 
    Thread.sleep(5000) 
    println("AfterTest", Thread.currentThread()) 
} 

def test2 = test1 onSuccess { case _ => println("Future on success") } 

def main(args: Array[String]): Unit = { 

    println("main", Thread.currentThread()) 
    test2 
    println("main123", Thread.currentThread()) 

    executor.shutdown() 
} 
+0

感謝您的信息。這工作。該程序現在不退出(我正在通過sbt運行)。你爲什麼認爲這是? – Jonna

+0

你必須關閉執行程序:executor.shutdown() –

+1

這工作。非常感謝。 – Jonna

-1

一個Future S中有趣的一點是,你不必自己處理線程。它們的執行方式完全取決於傳遞給Future.apply()方法的隱式ExecutionContext(以及其他方法,如map,flatMap,filter等)。一個非常嚴格的實現可以爲每個將來的計算創建一個新的線程,但最常見的情況是這些代碼是由JVM上的工作線程池執行的。

+0

他使用Twitter期貨 進口玉米.twitter.util._ –