如何在多个线程

时间:2015-06-08 14:13:11

标签: java multithreading

我为列表中的每个Object启动一个新的Thread并在那些上调用一个方法。我调用的方法返回一个我想要保存的值:

public int[] benchAll(){
    int[] numbers = new int[things.size()];
    for (final Thing thing: things) {
            final Generator generator = new Generator();

            new Thread(
                () -> generator.benchmark(thing)
            ).start();
            generators.add(generator);
        }
    return numbers;
    }

现在如何在其他线程中保存benchmark()的每个返回值,以使用此方法benchAll()返回它?

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

使用java.util.concurrent.ExecutorService正如Java规范所说:

  

Executor,提供管理终止和方法的方法   这可以产生一个跟踪一个或多个进度的Future   异步任务。

因此,使用ExecutorService的实现,您可以在给定数量的线程中异步或同步地运行所有任务。为此,您需要创建Callable个对象的列表,并将其传递给invokeAll对象的ExecutorService方法。 invokeAll方法将返回Future对象列表的列表(每个Future对象将代表每个任务,并且顺序与您放入传递给Callable方法的invokeAll列表中的顺序相同),您可以循环总计任务的所有结果并打印出来。

您应该阅读Executors类的所有可用方法,这些方法返回ExecutorService的不同实例,因此请选择适合您的方法。

通过这种方式,您将能够在M个线程中异步运行N个任务,并且一旦完成所有线程,您将获得Future对象列表,它将为您提供每个任务的完成信息/状态。
此结果可以与其他结果/数据合并,并从您的方法返回。

检查以下psuedo示例:

try {
    List<Callable<Object>> callableList = new ArrayList<Callable<Object>>();
    callableList.add(null); /*Add instance of Callable*/
    callableList.add(null); /*Add instance of Callable*/
    callableList.add(null); /*Add instance of Callable*/

    //Specify how many threads you want or need to operate. Read other methods of Executors which return different instances of ExecutorService
    final ExecutorService service = Executors.newFixedThreadPool(3);

    //This will invoke all your N tasks in specified M threads ...
    List<Future<String[]>> futureObjects = service.invokeAll(callableList);  //futureObjects will contain result of each thread execution
} catch (InterruptedException e) {
    e.printStackTrace();
}

答案 1 :(得分:0)

有各种方式...

易于实现,但不是一个好的设计:只需传递数组,并为每个生成器对象传递一个索引。

然后每个生成器只更新数组中的那个位置。

下行:很难说他们什么时候完成;并且如上所述:只是糟糕的设计(你的生成器代码不应该知道这个数组,更不用说特定的索引了。)

2015年Java中更好的方法:您想阅读有关Future接口的内容。然后,您可以使用ExecutorService;把它放在一起,突然间你的发电机实际上可以返回值。 (仍然要求你的代码做得恰到好处#34;守旧&#34;了解所有&#34;期货&#34;何时被收集)