Newer
Older
package midterm22
import java.util.concurrent.ForkJoinTask
import java.util.concurrent.RecursiveTask
import java.util.concurrent.ForkJoinWorkerThread
import java.util.concurrent.ForkJoinPool
import java.util.concurrent.atomic.AtomicInteger
val forkJoinPool = ForkJoinPool()
var parallelismEnabled = true
var tasksCreated: AtomicInteger = AtomicInteger(0)
def schedule[T](body: => T): ForkJoinTask[T] =
val t = new RecursiveTask[T]:
def compute = body
Thread.currentThread match
case wt: ForkJoinWorkerThread => t.fork()
case _ => forkJoinPool.execute(t)
t
def task[T](body: => T): ForkJoinTask[T] =
tasksCreated.incrementAndGet
schedule(body)
def parallel[A, B](op1: => A, op2: => B): (A, B) =
if parallelismEnabled then
val res1 = task { op1 }
val res2 = op2
(res1.join(), res2)
else (op1, op2)