summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sources/examples/oneplacebuffer.scala46
1 files changed, 46 insertions, 0 deletions
diff --git a/sources/examples/oneplacebuffer.scala b/sources/examples/oneplacebuffer.scala
new file mode 100644
index 0000000000..9a7d1d714d
--- /dev/null
+++ b/sources/examples/oneplacebuffer.scala
@@ -0,0 +1,46 @@
+package examples;
+
+object oneplacebuffer {
+
+ import scala.concurrent._;
+
+ class OnePlaceBuffer {
+ private val m = new MailBox(); // An internal mailbox
+ private case class Empty(), Full(x: Int); // Types of messages we deal with
+
+ 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)
+ }
+
+}