Java-多线程异步请求统一响应结果

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("所有人都跑完了,比赛结束。");
  • 9
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值