未来是否获得新线程



下面这样实现的未来会得到一个新线程吗?显然不是(见下面的输出)。为什么?如果我希望我的代码在新线程上运行,我该怎么办?

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])

(之前测试,线程[运行主-0,

5,运行主组-0])

(测试后,线程[运行主-0,5,运行主组-0])

成功的未来

(main123,线程[运行主-0,5,运行主组-0])

你使用的是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()
}

Future s的一个有趣的点是你不必自己处理线程。它们的执行方式完全取决于传递给Future.apply()方法(以及其他方法,如mapflatMapfilter等)的隐式ExecutionContext。一个非常粗略的实现可以为正在计算的每个未来创建一个新线程,但大多数情况下,这样的代码是由 JVM 上的工作线程池执行的。

相关内容

最新更新