这是我原来question的后续行动。假设我需要同步和异步地调用REST服务 。在同步的情况下,我想在调用程序线程上执行它而不从池中获取其他线程。
我想仅在一次编写我的业务逻辑,并在两种情况下重复使用它。业务逻辑包括构建请求和处理响应。
我还想撰写 REST调用,就好像在“调用服务A然后服务B然后服务C”
你会如何在Scala中完成?
答案 0 :(得分:2)
这应该在当前线程中运行......
{
val currentThreadEx = new AbstractExecutorService {
override def execute(r: Runnable) { r.run }
override def shutdownNow(): java.util.List[Runnable] = new java.util.ArrayList[Runnable]()
override def shutdown() {}
override def isTerminated = false
override def isShutdown = false
override def awaitTermination(timeout: Long, unit: TimeUnit) = false
}
implicit val exContext = ExecutionContext.fromExecutor(currentThreadEx)
val f = Future {
10 + 1
}
println(Await.result(f, 1 seconds))
}
这将在默认执行程序...
上运行{
import ExecutionContext.Implicits.global
val f = Future {
10 + 1
}
println(Await.result(f, 1 seconds))
}
如您所见,您可以使用ExecutorService作为抽象点。
或者您可以使用以Monads编写的函数,然后您可以将这些操作绑定在一起而不处理上下文(即Future)。
def op1[M[_]: Monad](i: Int)(j: Int): M[Int] = {
Monad[M].point { i * j }
}
println(Monad[Id].point(10) >>= op1[Id](10))
println((Future { 10 } >>= op1[Future](10)).run)