diff options
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() |