summaryrefslogtreecommitdiff
path: root/docs/examples/oneplacebuffer.scala
diff options
context:
space:
mode:
Diffstat (limited to 'docs/examples/oneplacebuffer.scala')
-rw-r--r--docs/examples/oneplacebuffer.scala52
1 files changed, 28 insertions, 24 deletions
diff --git a/docs/examples/oneplacebuffer.scala b/docs/examples/oneplacebuffer.scala
index 02b8a9cec6..f7047a1c92 100644
--- a/docs/examples/oneplacebuffer.scala
+++ b/docs/examples/oneplacebuffer.scala
@@ -2,35 +2,39 @@ package examples
object oneplacebuffer {
- import scala.concurrent.{MailBox, ops}
+ import scala.actors.Actor._
+ import scala.concurrent.ops
class OnePlaceBuffer {
- private val m = new MailBox() {} // An internal mailbox
- private case class Empty() // Types of messages we deal with
- private case class Full(x: Int)
+ private case class Put(x: Int)
+ private case object Get
- m send Empty() // Initialization
-
- def write(x: Int) {
- m receive {
- case Empty() =>
- println("put " + x)
- m send Full(x)
+ private val m = actor {
+ var buf: Option[Int] = None
+ loop {
+ react {
+ case Put(x) if buf.isEmpty =>
+ println("put "+x);
+ buf = Some(x); reply()
+ case Get if !buf.isEmpty =>
+ val x = buf.get
+ println("get "+x)
+ buf = None; reply(x)
+ }
}
}
+ m.start()
- def read: Int = m receive {
- case Full(x) =>
- println("get " + x)
- m send Empty(); x
- }
+ def write(x: Int) { m !? Put(x) }
+
+ def read(): Int = (m !? Get).asInstanceOf[Int]
}
def kill(delay: Int) = new java.util.Timer().schedule(
new java.util.TimerTask {
- override def run() = {
+ override def run() {
println("[killed]")
- exit(0)
+ sys exit 0
}
},
delay) // in milliseconds
@@ -40,19 +44,19 @@ object oneplacebuffer {
val random = new java.util.Random()
def producer(n: Int) {
- Thread.sleep(random.nextInt(1000))
- buf.write(n)
+ Thread.sleep(random nextInt 1000)
+ buf write n
producer(n + 1)
}
def consumer {
- Thread.sleep(random.nextInt(1000))
- val n = buf.read
+ Thread.sleep(random nextInt 1000)
+ val n = buf.read()
consumer
}
- ops.spawn(producer(0))
- ops.spawn(consumer)
+ ops spawn producer(0)
+ ops spawn consumer
kill(10000)
}