所以我使用的代码有点像这样:
public void callSlowService(List<Object> objectsToCallFor) {
objectsToCallFor
.parallelStream()
.forEach(object -> slowService.call(object))
}
其中slowService.call需要~100-500ms
问题是,我可以并行化我想要的所有内容,但是在一天结束的时候,我仍然会锁定一个500毫秒的线程只是等待,而我的CPU还有其他东西可以为其他线程做。
假设我无法改变这个其他服务(我不能),我可以使用其他一些设计来释放我的CPU在等待来自slowService的响应时执行其他操作?
答案 0 :(得分:0)
你不能。
但是,您可以缓解此问题。使用通过List<Object> objectsToCallFor
{{1}}传送的一个新主题,并在结果到达时向另一个队列提供。
您仍将等待所需的时间,但至少您的主要处理将同时继续。
答案 1 :(得分:0)
如果我理解正确,你想让这个方法异步。如果您不需要结果并且想要跳过错误处理,则可能需要在新线程中启动代码。 像:
public void callSlowService(final List<Object> objectsToCallFor) {
new Thread(() -> {
objectsToCallFor
.parallelStream()
.forEach(object -> slowService.call(object));
}).start();
}
另一种(更好)方式 - 使用ThreadPool。你应该小心使用parallelStream() - &gt;那么您将使用可能影响应用程序性能的共享ForkJoinPool。使用旧的良好缓存线程池更安全,或者任何其他线程池实现取决于项目需求。
public ExecutorService executor = Executors.newCachedThreadPool();
public void callSlowService(final List<Object> objectsToCallFor) {
for (Object obj : objectsToCallFor) {
executor.submit(() -> {
objectsToCallFor
.parallelStream()
.forEach(object -> slowService.call(object));
});
}
}
事实上,很少有其他方法可以以更美丽的方式制作类似的东西,但这也应该有用。