我为列表中的每个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()
返回它?
感谢您的帮助。
答案 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;何时被收集)