Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 混合数据类型的ExecutorService InvokeAll_Java_Multithreading_Executorservice_Invokeall - Fatal编程技术网

Java 混合数据类型的ExecutorService InvokeAll

Java 混合数据类型的ExecutorService InvokeAll,java,multithreading,executorservice,invokeall,Java,Multithreading,Executorservice,Invokeall,我是一个新手,尝试使用ExecutorService调用具有不同返回类型的多个线程。我需要等待所有线程完成,然后才能继续。我可以使用同构的返回类型,但希望使用异构的返回类型 下面是我的示例代码片段: @RestController public class ApplicationController { @GetMapping public String HelloWorld() { System.out.println("Inside Thread main"); Call

我是一个新手,尝试使用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;
}

}
@RestController
公共类应用程序控制器{
@GetMapping
公共字符串HelloWorld(){
System.out.println(“内螺纹主螺纹”);
可调用可调用任务=()->{
返回invokeThread1();
};
可调用callableTask2=()->{
返回invokeThread2();
};
列表任务=新建ArrayList();
System.out.println(“内螺纹主螺纹-1”);
StringBuilder结果=新建StringBuilder();
ExecutorService executor=Executors.newFixedThreadPool(10);
System.out.println(“内螺纹主螺纹-2”);
tasks.add(callableTask);
tasks.add(callableTask2);
试一试{
List futures=executor.invokeAll(任务);
for(未来f:未来){
result.append(f.get());
System.out.println(“结果::”+result);
}
}捕获(中断异常|执行异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
System.out.println(“内线程main-5”+result.toString());
返回result.toString();
}
私有字符串invokeThread1(){
最终字符串uri=”http://localhost:8082";
返回invokeService(uri).getBody();
}
私有字符串invokeThread2(){
最终字符串uri=”http://localhost:8083";
返回invokeService(uri).getBody();
}
private ResponseEntity invokeService(最终字符串uri){
RestTemplate RestTemplate=新RestTemplate();
HttpHeaders=新的HttpHeaders();
setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
HttpEntity=新的HttpEntity(“参数”,标题);
ResponseEntity result=restemplate.exchange(uri,HttpMethod.GET,entity,String.class);
返回结果;
}
}

假设invokeThread1的返回类型为String,而invokeThread2的返回类型为Integer。请帮助我进行必要的更改。

一个简单(但难看)的解决方案是将
Callable
作为类型,并确保您确切知道自己(或贡献者)正在做什么,然后将结果解析回您希望的格式,另一种方法是使用所有任务返回类型通用的接口。