并行化java中的调用

时间:2017-06-20 13:17:12

标签: java parallel-processing

我有以下代码:

List<ObjectA> allObjects = (List<ObjectA>) objArepository.findAll();

for (ObjectA objA : allObjects) {
        String location = objA.getUrl();

        Client client = utils.createClient();
        WebTarget webTarget = client.target(location).path("/testUrl/" + someString); 
        Invocation.Builder requestBuilder = webTarget.request();
        Response response;
        try {
            response = request.invoke();
            }
        }

而不是串行发送这些调用的for循环,我想并行发送这些调用,问题是因为我没有找到任何示例而且我想知道如何在java中执行此操作

1 个答案:

答案 0 :(得分:1)

使用ExecutorService

executorService.invokeAll可以并行执行任务列表并等待它们完成。

ExecutorService executor = getExecutorService();
List<Request> requests = getRequests();
List<Callable> tasks = requests.stream()
    .map(r -> new Processor(r))
    .collect(Collectors.toList());

executor.invokeAll(tasks);

如果您需要异步调用,请使用executorService.submitexecutorService.execute

更新

根据评论,我再添加一些关于上述代码的文字。

getExecutorServices()返回在其他地方创建的executorService,可能是单例,因为创建executorService非常昂贵。

getRequests()会返回请求列表,Request可以是您要处理的任何内容,例如问题中的ObjectA

executorService.invokeAll接受Callable列表,因此您必须将请求封装在callables中。 Processor是可调用的,可以处理Request

实际上,我认为代码非常具有描述性,普通的Java程序员可以理解它。