线程池配合Future实现,但是阻塞主请求线程,高并发时依然会造成线程数过多,CPU上下文切换,通过Future可以并发发出N个请求,然后等待最慢的一个返回,总响应时间为最慢的一个请求返回的用时
public class Test{
final static ExecutorService executor = Executors.newFixedThreadPool(2);
public static void main(String[] args){
RpcService rpcService = new RpcService();
HttpService httpService = new HttpService();
Future<Map<String,String>> future1 = null;
Future<Integer> future2 = null;
try{
future1 = executor.submit(()->rpcService.getRpcResult());
future2 = executor.submit(()->httpService.getHttpResult());
}catch(Exception e){
if(future1 != null){
future1.cancel(true);
}
if(future2 != null){
future2.cancel(true);
}
throw new RuntimeEException(e);
}
}
static class RpcService{
Map<String,String> gerRpcResult() throws Exception{
//调用远程方法,耗时10ms
}
}
static class HttpService{
Integer getHttpResult() throws Exception{
//调用远程方法,耗时30ms
}
}
}