如何在期货中传递函数输出,然后将那些期货传递给新函数?

时间:2018-12-27 10:07:16

标签: multithreading scala concurrent.futures

我的情况如下:

第1步:x = {def subtract(a,b)

Step2:Thread.sleep(1s)

Step3:y = import scala.util.{Failure, Success} def sum(a:Int ,b:Int) = a+b def sub(c:Int, d:Int) = c-d def mul(e: Int, f: Int) = e*f val Sum1= Future {sum(2,3); Thread.sleep(1000)} val SumFinal=Sum1.onComplete({ case Success(result) => println(result) case Failure(e) => println("failed: " + e) }) val Subt1 = Future {sub(5,3);Thread.sleep(2000)} val SubtFinal = Subt1.onComplete({ case Success(result) => result case Failure(e) => println("failed: " + e) }) val Mul1= mul(SumFinal,SubtFinal) println(Mul1)

Step4:Thread.sleep(2s)

Step5:成功完成上述步骤后,执行z = multiple(x,y)

我需要使用Scala中的Futures实现此方案。请帮忙。 我尝试了此代码,但无法正常工作。

getReqDetails

2 个答案:

答案 0 :(得分:0)

问题1:

例如的结果speedFuture {sub(5,3);Thread.sleep(2000)}返回的值,在Scala中为Thread.sleep。只需更改顺序即可:()将在2秒后显示结果Future {Thread.sleep(2000); sub(5,3)}。如果您确实要在计算后加上2,只需将结果存储在变量中即可:

sleep

问题2:

Future { val res = sub(5,3) Thread.sleep(2000) res } SumFinal再次为SubtFinal,因为()返回。相反,您可以组合两个期货(或多个,或修改一个,等等,等等)并收回一个期货。一种方法是(在解决问题1之后)

onComplete

答案 1 :(得分:0)

您的方法存在的问题是onComplete返回unit。这就是为什么您没有任何结果的原因。因此,subFimal和sumFinal中没有任何内容。

scala> def sum(a: Int, b: Int) = Future { a + b }
sum: (a: Int, b: Int)scala.concurrent.Future[Int]

scala> def sub(a: Int, b: Int) = Future { a - b }
sub: (a: Int, b: Int)scala.concurrent.Future[Int]

scala> def mul(a: Int, b: Int) = Future { a * b }
mul: (a: Int, b: Int)scala.concurrent.Future[Int]

scala> for {
     | a <- sum(2,3)
     | b <- sub(10, 7)
     | c <- mul(a, b)
     | } yield c
res0: scala.concurrent.Future[Int] = Future(<not completed>)

scala> res0
res1: scala.concurrent.Future[Int] = Future(Success(15))