3

以下のように実装された未来は新しいスレッドを取得しますか? どうやらそうではありません (以下の出力を参照)。なんで?コードを新しいスレッドで実行したい場合はどうすればよいですか?

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())
  }
}

出力:

(main,Thread[run-main-0,5,run-main-group-0])

(BeforeTest,Thread[run-main-0,5,run-main-group-0])

(AfterTest,Thread[run-main-0,5,run-main-group-0])

成功の未来

(main123,Thread[run-main-0,5,run-main-group-0])

4

2 に答える 2

5

scala先物ではなく、twitter先物を使用しています。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()
}
于 2016-02-19T08:47:20.033 に答える