Scala 中的未来和无限循环

Future and infinite loop in Scala

我想在 scala 中执行 2 个独立的无限循环。每个 运行 第一个任务大约需要 1 秒,第二个任务需要 0.5 秒。

代码如下:

package future
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration.Duration
import scala.concurrent.{Await, Future}

object MyFuture {
  def task1(): Future[Unit] = Future {
    println("doing job 1")
    Thread.sleep(1000)
  }

  def task2(): Future[Unit] = Future {
    println("doing job 2")
    Thread.sleep(500)
  }

  def infiniteLoop(): Future[Unit] = {
    Future.sequence(List(task1(), task2())).flatMap(x => infiniteLoop())
  }

  def main(args: Array[String]): Unit = {

    Await.ready(infiniteLoop(), Duration.Inf)
  }

}

程序的输出

doing job 1
doing job 2
doing job 2
doing job 1
doing job 1
doing job 2
doing job 1
doing job 2
doing job 1
doing job 2
doing job 1
doing job 2
doing job 1
doing job 2
doing job 1
doing job 2
doing job 1
doing job 2

我希望作业 2 的输出是作业 1 的两倍,因为它需要一半的时间。

我可以做什么来模拟 2 个真正的独立进程?

考虑使用 java 的 scheduled executor 以固定间隔安排任务。或者,如果您需要在这些任务之间进行通信,则可以使用 Akka。 顺便说一句,这段代码可以满足您的要求:

import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration.Duration
import scala.concurrent.{Await, Future}

/**
  * Created by hibou on 13/02/16.
  */
object MyFuture {
  def task1(): Future[Unit] = Future {
    println("doing job 1")
    Thread.sleep(1000)
  }

  def task2(): Future[Unit] = Future {
    println("doing job 2")
    Thread.sleep(500)
  }

  def loopTask1(): Future[Unit] = {
    task1.flatMap(_ => loopTask1())
  }

   def loopTask2(): Future[Unit] = {
    task2.flatMap(_ => loopTask2())
  }

  def infiniteLoop(): Future[Unit] = {
    Future.sequence(List(loopTask1(), loopTask2())).map(_ => ())
  }

  def main(args: Array[String]): Unit = {

    Await.ready(infiniteLoop(), Duration.Inf)
  }


}