编写一个Java函数,通过调用AService.get()、BService.get()、CService.get()三个接口,获取三个整数,然后将这三个整数累加,最终返回累加的值。要求: 1.调用三个接口的操作需要并行执行,以提高效率; 2.累加操作需要在获取三个整数的操作完成后进行,因此需要保证三个整数均已获取后才能进行累加操作; 3.考虑多线程安全问题。
时间: 2023-12-14 07:38:04 浏览: 144
Java第二次作业 完整版
5星 · 资源好评率100%
可以使用Java的CompletableFuture来实现并行调用三个接口,并在获取结果后进行累加操作,同时确保线程安全。
具体代码如下:
```java
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.atomic.AtomicInteger;
public class ServiceDemo {
private AService aService;
private BService bService;
private CService cService;
public ServiceDemo(AService aService, BService bService, CService cService) {
this.aService = aService;
this.bService = bService;
this.cService = cService;
}
public int sum() throws InterruptedException, ExecutionException {
AtomicInteger sum = new AtomicInteger(0);
CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> aService.get());
CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> bService.get());
CompletableFuture<Integer> future3 = CompletableFuture.supplyAsync(() -> cService.get());
CompletableFuture<Void> allFutures = CompletableFuture.allOf(future1, future2, future3);
allFutures.get();
sum.addAndGet(future1.get());
sum.addAndGet(future2.get());
sum.addAndGet(future3.get());
return sum.get();
}
}
```
其中,使用AtomicInteger来保证线程安全,使用CompletableFuture.allOf来等待所有的异步调用完成,然后获取结果进行累加。
需要注意的是,如果三个接口中有一个接口出现异常,那么整个方法会抛出ExecutionException异常。此时可以通过getCause()方法获取到具体的异常信息。
阅读全文