summaryrefslogtreecommitdiff
path: root/sources/examples/buffer1.scala
diff options
context:
space:
mode:
Diffstat (limited to 'sources/examples/buffer1.scala')
-rw-r--r--sources/examples/buffer1.scala48
1 files changed, 39 insertions, 9 deletions
diff --git a/sources/examples/buffer1.scala b/sources/examples/buffer1.scala
index 40be8431be..2afb4377bf 100644
--- a/sources/examples/buffer1.scala
+++ b/sources/examples/buffer1.scala
@@ -1,16 +1,46 @@
package examples;
-import scala.concurrent._;
+object buffer1 {
-class OnePlaceBuffer() {
- private val m = new MailBox(); // An internal mailbox
- private case class Empty(), Full(x: Int); // Types of messages we deal with
+ import scala.concurrent._;
- m send Empty(); // Initialization
+ class OnePlaceBuffer {
+ private val m = new MailBox(); // An internal mailbox
+ private case class Empty(), Full(x: Int); // Types of messages we deal with
- def write(x: Int): Unit =
- m receive { case Empty() => m send Full(x) }
+ m send Empty(); // Initialization
+
+ def write(x: Int): Unit = m receive {
+ case Empty() =>
+ Console.println("put " + x);
+ m send Full(x)
+ }
+
+ def read: Int = m receive {
+ case Full(x) =>
+ Console.println("get " + x);
+ m send Empty() ; x
+ }
+ }
+
+ def main(args: Array[String]) = {
+ val buf = new OnePlaceBuffer;
+ val random = new java.util.Random();
+
+ def producer(n: int): unit = {
+ Thread.sleep(random.nextInt(1000));
+ buf.write(n);
+ producer(n + 1)
+ }
+
+ def consumer: unit = {
+ Thread.sleep(random.nextInt(1000));
+ val n = buf.read;
+ consumer
+ }
+
+ ops.spawn(producer(0));
+ ops.spawn(consumer)
+ }
- def read: Int =
- m receive { case Full(x) => m send Empty() ; x }
}