Future 是否有新线程?
Does a Future get a new thread?
像下面这样实现的未来是否有新线程?显然不是(见下面的输出)。为什么?如果我想让我的代码在新线程上 运行 怎么办?
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[运行-main-0,5,运行-main-group-0])
(测试前,线程[运行-main-0,5,运行-main-group-0])
(AfterTest,Thread[运行-main-0,5,运行-main-group-0])
成功的未来
(main123,Thread[运行-main-0,5,运行-main-group-0])
Future
s 的一个有趣点是您不必自己处理线程。它们的执行方式完全取决于传递给 Future.apply()
方法(以及 map
、flatMap
、filter
等其他方法)的隐式 ExecutionContext
。 ).一个非常粗糙的实现可以为每个正在计算的未来创建一个新线程,但最常见的情况是此类代码由 JVM 上的工作线程池执行。
您使用的是 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()
}
像下面这样实现的未来是否有新线程?显然不是(见下面的输出)。为什么?如果我想让我的代码在新线程上 运行 怎么办?
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[运行-main-0,5,运行-main-group-0])
(测试前,线程[运行-main-0,5,运行-main-group-0])
(AfterTest,Thread[运行-main-0,5,运行-main-group-0])
成功的未来
(main123,Thread[运行-main-0,5,运行-main-group-0])
Future
s 的一个有趣点是您不必自己处理线程。它们的执行方式完全取决于传递给 Future.apply()
方法(以及 map
、flatMap
、filter
等其他方法)的隐式 ExecutionContext
。 ).一个非常粗糙的实现可以为每个正在计算的未来创建一个新线程,但最常见的情况是此类代码由 JVM 上的工作线程池执行。
您使用的是 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()
}