如果我依赖于慢速服务,我该如何避免花费处理器时间等待它?

时间:2017-02-22 08:11:02

标签: java multithreading service architecture

所以我使用的代码有点像这样:

public void callSlowService(List<Object> objectsToCallFor) {
    objectsToCallFor
        .parallelStream()
        .forEach(object -> slowService.call(object))
}

其中slowService.call需要~100-500ms

问题是,我可以并行化我想要的所有内容,但是在一天结束的时候,我仍然会锁定一个500毫秒的线程只是等待,而我的CPU还有其他东西可以为其他线程做。

假设我无法改变这个其他服务(我不能),我可以使用其他一些设计来释放我的CPU在等待来自slowService的响应时执行其他操作?

2 个答案:

答案 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));
        });
    }
}

事实上,很少有其他方法可以以更美丽的方式制作类似的东西,但这也应该有用。