并发计算可以有效提高计算效率,尤其在多CPU情况下,本示例说明一种并发计算的实现方法。
这个例子用来计算Fibonacci 数列。
import java.util.concurrent.*
CUTOFF = 12 // 对太小的值不值得采用并发计算,所以设定一个限定值
THREADS = 100
println "Calculating Fibonacci sequence in parallel..."
//串行计算,只用于计算小数,注意递归的调用方法
serialFib = { n -> (n < 2) ? n : serialFib(n-1) + serialFib(n-2) }
//定义线程池
pool = Executors.newFixedThreadPool(THREADS)
//利用线程池内的线程进行计算
defer = { c -> pool.submit(c as Callable) }
//并行计算方法
fib = { n ->
if (n < CUTOFF) return serialFib(n)
//把子任务交给其它线程来计算
def left = defer{ fib(n-1) }
def right = defer{ fib(n-2) }
//获得计算结果,然后求和
left.get() + right.get()
}
//从8到16,依次进行计算,并打印结果
(8..16).each{ n -> println "n=$n => ${fib(n)}" }
pool.shutdown()
计算结果输出:
Calculating Fibonacci sequence in parallel... n=8 => 21 n=9 => 34 n=10 => 55 n=11 => 89 n=12 => 144 n=13 => 233 n=14 => 377 n=15 => 610 n=16 => 987