Java多线程场景题
相同功能的三个接口只要有一个接口返回成功了就可以有什么方案CompletableFuture多线程消息队列importjava.util.concurrent.CompletableFuture;importjava.util.concurrent.TimeUnit;publicclassRedundantCaller{publicstaticStringcallServices(){// 1. 创建三个异步任务分别调用三个接口CompletableFutureStringfuture1CompletableFuture.supplyAsync(()-callServiceA());CompletableFutureStringfuture2CompletableFuture.supplyAsync(()-callServiceB());CompletableFutureStringfuture3CompletableFuture.supplyAsync(()-callServiceC());// 2. 等待任意一个成功完成即可CompletableFutureObjectanySuccessCompletableFuture.anyOf(future1,future2,future3);try{// 3. 阻塞等待最多等待 5 秒超时时间按业务设置return(String)anySuccess.get(5,TimeUnit.SECONDS);}catch(Exceptione){// 所有接口都失败或超时thrownewRuntimeException(所有服务均调用失败,e);}}privatestaticStringcallServiceA(){// 模拟接口调用随机成功或失败returnResult from A;}// 同理 callServiceB、callServiceC}ExecutorServiceexecutorExecutors.newFixedThreadPool(3);ListFutureStringfuturesnewArrayList();// 提交三个任务futures.add(executor.submit(()-callA()));futures.add(executor.submit(()-callB()));futures.add(executor.submit(()-callC()));Stringresultnull;longdeadlineSystem.currentTimeMillis()5000;// 5秒超时// 轮询谁先完成就取谁while(System.currentTimeMillis()deadline){for(FutureStringfuture:futures){if(future.isDone()){try{resultfuture.get();break;// 找到一个成功的就退出}catch(Exceptione){// 这个任务失败了继续看下一个}}}if(result!null)break;// 没完成就稍微等一下再轮询Thread.sleep(50);}// 取消所有未完成的任务for(FutureStringfuture:futures){future.cancel(true);}executor.shutdown();if(resultnull){thrownewRuntimeException(所有服务均失败或超时);}returnresult;