Java-多线程异步请求统一响应结果
多线程异步请求是指在多个线程同时发起请求,并且在请求过程中不阻塞主线程的执行。这样可以提高程序的并发能力和响应速度。
需要注意的是,在实际的异步请求中,可能需要使用Future或其他方式来等待请求的完成,并获取返回结果。上面的示例只是演示了如何使用多线程来执行异步请求,具体的处理逻辑需要根据实际需求进行修改。
示例一
//示例一
int threadNum = 3;
List<Future<String>> futureList = new ArrayList<>();
ExecutorService executorService = Executors.newFixedThreadPool(threadNum);
for (int i = 0; i < threadNum; i++) {
Future<String> future = executorService.submit(new Callable<String>() {
@Override
public String call() throws Exception {
// Thread.sleep(3000);
//业务
AjaxResult ajaxResult = apiService.appLogin(req);
String data = ajaxResult.get("data").toString();
return "我是任务结果:"+data;
}
});
futureList.add(future);
}
for (int i = 0; i < futureList.size(); i++) {
String s = futureList.get(i).get();
System.out.println(s);
}
示例二
//示例二
int threadNum = 3;
List<CompletableFuture> objects = Collections.synchronizedList(new ArrayList<>());
ExecutorService es = Executors.newFixedThreadPool(threadNum);
for (int i = 0; i < threadNum; i++) {
// 创建任务
objects.add(CompletableFuture.supplyAsync(() -> {
// Thread.sleep(1000);
//业务
AjaxResult ajaxResult = null;
try {
ajaxResult = apiService.appLogin(req);
} catch (Exception e) {
e.printStackTrace();
}
String data = ajaxResult.get("data").toString();
return "我是任务结果:"+data;
}, es).handle((result,e)->{
// 返回 结果和异常信息,没有异常e返回null
System.out.println("结果和异常信息"+result+"-error:"+e);
return result;
}));
}
CompletableFuture<Void> voidCompletableFuture = CompletableFuture.allOf(objects.toArray(new CompletableFuture[objects.size()]));
// join方法会阻塞线程,等待全部执行完成
List<Object> collect = objects.stream().map(CompletableFuture::join).collect(Collectors.toList());
System.out.println("全部执行结果:"+collect);
System.out.println("是否全部完成:"+voidCompletableFuture.isDone());
// 关闭线程池,否则main方法不会结束
es.shutdown();
示例三
//示例三
int threadNum = 3;
CountDownLatch countDownLatch = new CountDownLatch(threadNum);
/*常用的实现类:ThreadPoolExecutor,参数:
corePoolSize - 核心线程数,池中所保存的线程数,包括空闲线程。
maximumPoolSize - 池中允许的最大线程数=核心线程数+临时线程数。
keepAliveTime - 临时线程等待新任务的最长时间。
unit - keepAliveTime 参数的时间单位。
workQueue - 阻塞队列*/
ThreadPoolExecutor tp = new ThreadPoolExecutor(5, 5, 10, TimeUnit.SECONDS, new LinkedBlockingDeque<>());
tp.allowCoreThreadTimeOut(true);
for (int i = 0; i < threadNum; i++) {
int finalI = i + 1;
Runnable runnable = new Runnable() {
@Override
public void run() {
Long ll = (long) (Math.random() * 1000);
try {
// Thread.sleep(ll);
//业务
apiService.appLogin(req);
} catch (Exception e) {
e.printStackTrace();
} finally {
countDownLatch.countDown();
System.out.println(finalI + "号选手,完成了比赛!:" + ll + "秒:" + Thread.currentThread().getName());
}
}
};
// 提交任务
tp.submit(runnable);
}
System.out.println("等待5个运动员都跑完.....");
countDownLatch.await();
tp.shutdown(); // 关闭线程池
System.out.println(tp.isShutdown());
System.out.println(tp.isTerminated());
System.out.println("所有人都跑完了,比赛结束。");