import java.util.concurrent.Callable
import java.util.concurrent.Executors
long ts // timer
def pool = Executors.newFixedThreadPool(THREADS)
def defer = { c -> pool.submit(c as Callable) }
//PLAIN//////////////////////////////////////////
ts = (new Date().time)
doit = { n ->
def left = { def slp = Math.random()*n*1000+500l as Long; Thread.sleep(slp); println Thread.currentThread().name + '!!left!!'+slp }()
def right = { def slp = Math.random()*n*1000+500l as Long; Thread.sleep(slp); println Thread.currentThread().name + '!!right!!'+slp }()
}
(1..3).each{ n -> println "n=$n => ${doit(n)}" }
println ((new Date().time)-ts)
//POOLED//////////////////////////////////////////////
ts = (new Date().time)
THREADS = 3
fib = { n ->
def left = defer{ def slp = Math.random()*n*1000+500l as Long; Thread.sleep(slp); println Thread.currentThread().name + '!!left!!'+slp }
def right = defer{ def slp = Math.random()*n*1000+500l as Long; Thread.sleep(slp); println Thread.currentThread().name + '!!right!!'+slp }
}
(1..3).each{ n -> println "n=$n => ${fib(n)}" }
pool.shutdown()
while(!pool.isTerminated()) { Thread.sleep(100) }
println ((new Date().time)-ts)
//FIB//////////////////////////////////////////////////
println "Calculating Fibonacci sequence in parallel..."
CUTOFF = 12 // not worth parallelizing for small n
THREADS = 10
serialFib = { n -> (n < 2) ? n : serialFib(n-1) + serialFib(n-2) }
fib = { n ->
if (n < CUTOFF) return serialFib(n)
def left = defer{ println Thread.currentThread().name; fib(n-1) }
def right = defer{ println Thread.currentThread().name; fib(n-2) }
left.get() + right.get()
}
(11..16).each{ n -> println "n=$n => ${fib(n)}" }
pool.shutdown()
Sunday, March 4, 2012
Thread Pools
Labels:
concurrent,
parallel,
pool,
thread
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment