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