Groovy并发:在语义上聚合结果的更好方法?

Ste*_*all 3 concurrency groovy multithreading

我需要并行调用多个方法并等待结果.每个都依赖于不同的资源,因此它们可能会在不同的时间返回.我需要等到收到所有结果或在一段时间后超时.

我可以通过方法调用生成带有对共享对象的引用的线程,但有没有更好,更常规的方法来做到这一点?

目前的实施:

        Executors exec = Executors.newFixedThreadPool(10);

        for (obj in objects) {
            def method = {
                def result = new ResultObject(a: obj, b: obj.callSomeMethod())
                result
            } as Callable<ResultObject>

            callables << method
        }

        List<Future<ResultObject>> results = exec.invokeAll(callables)

        for (result in results) {
            try{
                 def searchResult = result.get()
                 println 'result retrieved'
            }  catch (Exception e)
            {
                println 'exception'
                e.printStackTrace()
            }
        }
}
Run Code Online (Sandbox Code Playgroud)

Dón*_*nal 6

Groovier解决方案是使用GPars - 一个用Groovy编写的并发库.

import static groovyx.gpars.GParsExecutorsPool.withPool

withPool {
    def callable = {obj -> new ResultObject(a: obj, b: obj.callSomeMethod())}.async()
    List<ResultObject> results = objects.collect(callable)*.get()
}
Run Code Online (Sandbox Code Playgroud)