像下面这样实现的未来会得到一个新线程吗?显然不是(见下面的输出)。为什么?如果我希望在一个新线程上运行我的代码,我应该做什么?
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,Threadrun-main-0,5,run-main-group-0)
(BeforeTest,线程-主-0,5,运行-主-组-0)
(AfterTest,线程-主-0,5,运行-主-组-0)
成功的未来
(main123,线程-主-0,5,运行-主-组-0)
发布于 2016-02-19 08:47:20
你使用的是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()
}发布于 2016-02-19 08:42:47
Future的一个有趣之处是,您不必自己处理线程。它们的执行方式完全取决于传递给Future.apply()方法的隐式Future.apply()(以及其他方法,如map、flatMap、filter等)。一个非常粗略的实现可以为未来计算的每个线程创建一个新线程,但大多数情况是这样的代码是由JVM上的一个工作线程池执行的。
https://stackoverflow.com/questions/35500396
复制相似问题