LINUX.ORG.RU

История изменений

Исправление cdshines, (текущая версия) :

Традиционный пинг-понг, но в этом случае многопоточность не нужна.

Если хочется, сделай на акторах. Для примера накидал сессию для ammonite, попробуй, если будет охота.

interp.load.ivy("com.typesafe.akka" % "akka-actor_2.11" % "2.4.10")

import akka._
import akka.actor._
import scala.compat.Platform
import scala.util.Random

case class Start(ref: ActorRef)
case object Run

class Timer extends Actor {
  def receive = {
    case Start(worker: ActorRef) =>
      val time = Random.nextInt(1000);
      println(s"waiting for $time ms"); 
      Thread.sleep(time); // так не делают, но для эмуляции задержек прокатит
      worker ! Run
  }
}

class Worker extends Actor {
  def receive = {
    case Run =>
      println(s"run @ ${Platform.currentTime}");
      sender() ! Start(self)
  }
}

val system = ActorSystem()
val w = system.actorOf(Props(classOf[Worker]))
val t = system.actorOf(Props(classOf[Timer]))
t ! Start(w)

Исходная версия cdshines, :

Традиционный пинг-понг, но в этом случае многопоточность не нужна.

Если хочется, сделай на акторах. Для примера накидал сессию для ammonite, попробуй, если будет охота.

interp.load.ivy("com.typesafe.akka" % "akka-actor_2.11" % "2.4.10")

import akka._
import akka.actor._
import scala.compat.Platform
import scala.util.Random

case class Start(ref: ActorRef)
case object Run

class Timer extends Actor {
  def receive = (msg: Any) => msg match {
    case Start(worker: ActorRef) =>
      val time = Random.nextInt(1000);
      println(s"waiting for $time ms"); 
      Thread.sleep(time); // так не делают, но для эмуляции задержек прокатит
      worker ! Run
  }
}

class Worker extends Actor {
  def receive = (msg: Any) => msg match {
    case Run =>
      println(s"run @ ${Platform.currentTime}");
      sender() ! Start(self)
  }
}

val system = ActorSystem()
val w = system.actorOf(Props(classOf[Worker]))
val t = system.actorOf(Props(classOf[Timer]))
t ! Start(w)