首页 > 解决方案 > ExecutorService InvokeAll 用于混合数据类型

问题描述

我是新手,尝试使用 ExecutorService 调用具有不同返回类型的多个线程。在继续之前,我需要等待所有线程完成。我可以使用同质返回类型来做到这一点,但想使用异构返回类型。

下面是我的示例代码片段:

@RestController
public class ApplicationController {

@GetMapping
public String HelloWorld() {
    System.out.println("Inside Thread main");

    Callable<String> callableTask = () -> {
        return invokeThread1();
    };

    Callable<String> callableTask2 = () -> {
        return invokeThread2();
    };

    List<Callable<String>> tasks = new ArrayList<>();

    System.out.println("Inside Thread main - 1 ");

    StringBuilder result = new StringBuilder();

    ExecutorService executor = Executors.newFixedThreadPool(10);
    System.out.println("Inside Thread main - 2");

    tasks.add(callableTask);
    tasks.add(callableTask2);


    try {
        List<Future<String>> futures = executor.invokeAll(tasks);

        for (Future<String> f : futures) {
            result.append(f.get());
            System.out.println(" result ::: " + result);
        }


    } catch (InterruptedException | ExecutionException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    System.out.println("Inside Thread main - 5 " + result.toString());
    return result.toString();
}

private String invokeThread1() {

    final String uri = "http://localhost:8082";

    return invokeService(uri).getBody();
}

private String invokeThread2() {

    final String uri = "http://localhost:8083";

    return invokeService(uri).getBody();
}

private ResponseEntity<String> invokeService(final String uri) {
    RestTemplate restTemplate = new RestTemplate();

    HttpHeaders headers = new HttpHeaders();
    headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
    HttpEntity<String> entity = new HttpEntity<String>("parameters", headers);

    ResponseEntity<String> result = restTemplate.exchange(uri, HttpMethod.GET, entity, String.class);
    return result;
}

}

想象一下 invokeThread1 的返回类型是 String,而invokeThread2 的返回类型是 Integer。请帮助我进行必要的更改。

标签: javamultithreadingexecutorserviceinvokeall

解决方案


推荐阅读