diff options
author | Philipp Haller <hallerp@gmail.com> | 2010-04-11 18:09:46 +0000 |
---|---|---|
committer | Philipp Haller <hallerp@gmail.com> | 2010-04-11 18:09:46 +0000 |
commit | e7718496ee34035bbc50f5b9df0441662f7834ea (patch) | |
tree | 3e6b7d7ad765d51608eb4a2ea3ba3a29b33736fa /src/actors | |
parent | 8ee1f32478b63286b450a1ac5200ce4da39e69ff (diff) | |
download | scala-e7718496ee34035bbc50f5b9df0441662f7834ea.tar.gz scala-e7718496ee34035bbc50f5b9df0441662f7834ea.tar.bz2 scala-e7718496ee34035bbc50f5b9df0441662f7834ea.zip |
Made use of random number generator in ForkJoin...
Made use of random number generator in ForkJoinScheduler's fair mode
thread safe. Review by plocinic.
Diffstat (limited to 'src/actors')
-rw-r--r-- | src/actors/scala/actors/scheduler/ForkJoinScheduler.scala | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/src/actors/scala/actors/scheduler/ForkJoinScheduler.scala b/src/actors/scala/actors/scheduler/ForkJoinScheduler.scala index ab4fca04ca..4aaef16661 100644 --- a/src/actors/scala/actors/scheduler/ForkJoinScheduler.scala +++ b/src/actors/scala/actors/scheduler/ForkJoinScheduler.scala @@ -3,7 +3,6 @@ package scheduler import java.util.{Collection, ArrayList} import scala.concurrent.forkjoin._ -import scala.util.Random /** The <code>ForkJoinScheduler</code> is backed by a lightweight * fork-join task execution framework. @@ -23,12 +22,19 @@ class ForkJoinScheduler(val initCoreSize: Int, val maxSize: Int, daemon: Boolean protected val CHECK_FREQ = 10 + // this random number generator is only used in fair mode + private lazy val random = new java.util.Random // guarded by random + + def this(d: Boolean, f: Boolean) { + this(ThreadPoolConfig.corePoolSize, ThreadPoolConfig.maxPoolSize, d, f) + } + def this(d: Boolean) { - this(ThreadPoolConfig.corePoolSize, ThreadPoolConfig.maxPoolSize, d, true) + this(d, true) // default is fair } def this() { - this(false) + this(false) // default is non-daemon } private def makeNewPool(): DrainableForkJoinPool = { @@ -109,7 +115,7 @@ class ForkJoinScheduler(val initCoreSize: Int, val maxSize: Int, daemon: Boolean override def executeFromActor(task: Runnable) { // in fair mode: 2% chance of submitting to global task queue - if (fair && Random.nextInt(50) == 1) + if (fair && random.synchronized { random.nextInt(50) == 1 }) pool.execute(task) else task.asInstanceOf[RecursiveAction].fork() |