以下のように実装された将来は新しいスレッドを取得しますか?明らかにそうではありません(以下の出力を参照)。どうして?コードを新しいスレッドで実行したい場合はどうすればよいですか?
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])
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()
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加