从启动的线程收集返回值? [最新的Java]

时间:2009-12-04 07:20:23

标签: java multithreading

我正在寻找实现以下内容的最简单,最直接的方法:

  • 主要启动并启动3个线程
  • 所有3个任务都处理并以结果值结束(我需要以某种方式返回?)
  • 主要等待(.join?)在每个线程上,以确保他们完成所有3个任务
  • main以某种方式获取每个线程的值(3个值)

然后其余部分相当简单,处理3个结果然后终止......

现在,我一直在做一些阅读并找到了多个想法,比如:

  • 使用Future,但这是forynch,当主线程需要阻止等待所有3个生成的线程到finsih时,这真的是一个好主意吗?
  • 传入一个对象(到一个线程),然后简单地让线程“填充”结果
  • 以某种方式使用Runnable(不确定如何)。

无论如何 - 什么是最好的,最简单的推荐方法? 谢谢,

2 个答案:

答案 0 :(得分:8)

List<Callable<Result>> list = ... create list of callables

ExecutorService es = Executors.newFixedThreadPool(3);
List<Future<Result>> results = es.invokeAll(list);
只有在所有任务(Callable实例)完成后,

ExecutorService.invokeAll方法才会返回,无论是正常还是抛出异常。

有关详细信息,请参阅ExecutorService(主要是invokeAll方法),ExecutorsCallable

答案 1 :(得分:0)

您也可以使用java.util.concurrent中的信号量。

使用1 - #threads许可创建一个新的Semaphore,并在信号量上调用主要的gets()。

当你创建的每个线程完成它的工作时,让它调用release()方法。

由于您创建了一个允许负数的信号量,因此对acquire()的调用将阻塞,直到此数字变为正数。直到你的所有线程都在Semaphore上发布了许可证后才会发生这种情况。