diff options
author | stepancheg <stepancheg@epfl.ch> | 2008-06-10 19:52:33 +0000 |
---|---|---|
committer | stepancheg <stepancheg@epfl.ch> | 2008-06-10 19:52:33 +0000 |
commit | 740c36ace1b1efd328bc887a935b4e1ce2a6f1ef (patch) | |
tree | 52d0a06160dca8ab06f4a87997163f93f0f216e3 /test | |
parent | 86d6fb22d0460739428fdc25085761180aa10fc2 (diff) | |
download | scala-740c36ace1b1efd328bc887a935b4e1ce2a6f1ef.tar.gz scala-740c36ace1b1efd328bc887a935b4e1ce2a6f1ef.tar.bz2 scala-740c36ace1b1efd328bc887a935b4e1ce2a6f1ef.zip |
SyncVar enhancements:
* deprecation of "exception" field
* addition of blocking-queue-like "take", "put" methods
* change of "unset" signature
Diffstat (limited to 'test')
-rw-r--r-- | test/files/run/sync-var.check | 1 | ||||
-rw-r--r-- | test/files/run/sync-var.scala | 53 |
2 files changed, 54 insertions, 0 deletions
diff --git a/test/files/run/sync-var.check b/test/files/run/sync-var.check new file mode 100644 index 0000000000..e77aa319a5 --- /dev/null +++ b/test/files/run/sync-var.check @@ -0,0 +1 @@ +50005000 50005000 true diff --git a/test/files/run/sync-var.scala b/test/files/run/sync-var.scala new file mode 100644 index 0000000000..aa6ae9fa34 --- /dev/null +++ b/test/files/run/sync-var.scala @@ -0,0 +1,53 @@ +import java.util.concurrent._ +import java.util.concurrent.atomic._ + +object Test { def main(args: Array[String]) { + +val n = 10000 +val i = new AtomicInteger(n) +val j = new AtomicInteger(n) +val sum = new AtomicInteger + +val q = new scala.concurrent.SyncVar[Int] + +val producers = (1 to 3).force map { z => new Thread { + override def run() { + var again = true + while (again) { + val x = i.getAndDecrement() + if (x > 0) + q put x + else + again = false + } + } +} } + +val summers = (1 to 7).force map { z => new Thread { + override def run() { + val x = j.decrementAndGet() + if (x >= 0) { + sum addAndGet q.take() + } + if (x > 0) { + run() + } else { + // done + } + } +} } + +summers foreach { _.start() } +producers foreach { _.start() } + +summers foreach { _.join() } + +val got = sum.get +val expected = (n + 1) * n / 2 +println(got + " " + expected + " " + (got == expected)) + +producers foreach { _.join() } + +} } + +// vim: set ts=2 sw=2 et: |