Scala 未来会有新的线索吗?
像下面这样实现的未来会得到一个新线程吗?显然不是(见下面的输出)。为什么?如果我希望我的代码在新线程上运行,我应该怎么做Scala 未来会有新的线索吗?,scala,twitter-util,Scala,Twitter Util,像下面这样实现的未来会得到一个新线程吗?显然不是(见下面的输出)。为什么?如果我希望我的代码在新线程上运行,我应该怎么做 package MyTest import com.twitter.util._ import scala.language.postfixOps object Test { def test1 = Future { println("BeforeTest", Thread.currentThread()) Thread.sleep(5000)
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())
}
}
输出:
(主线程[run-main-0,5,run-main-group-0])
(测试前,线程[run-main-0,5,run-main-group-0])
(后测试,螺纹[run-main-0,5,run-main-group-0])
成功的未来
(main123,Thread[run-main-0,5,run-main-group-0])Futures有趣的一点是,您不必自己处理线程。它们的执行方式完全取决于传递给
Future.apply()
方法(以及其他方法,如map
,flatMap
,过滤器等)的隐式ExecutionContext
。一个非常粗略的实现可以为每一个正在计算的未来创建一个新线程,但最常见的情况是这样的代码是由JVM上的一组工作线程执行的。您使用的是twitter期货,而不是scala期货。
默认情况下,Twitter期货不是多线程的。
您必须使用(将ExecutorService与您选择的线程池一起传递给它)
未经测试的示例(我希望足够简单):
他正在使用Twitter期货导入com.Twitter.util.\u感谢您提供的信息。成功了。程序现在没有退出(我正在通过sbt运行)。你为什么这么认为?你必须关闭执行器:executor.shutdown()
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()
}