使用单例 Executor 服务或特定于功能的 Executor 服务性能更高吗?

Adr*_*ian 0 java spring graphql

我真正想弄清楚的是如何思考这个问题,或者从在这个领域有更多经验的人那里得到一些见解。

假设这是一个 Web 服务中的单例类,就像一个 graphql 数据获取器。哪个在规模上更高效:第一个还是第二个?或者会有什么性能差异?

public class FooBarClass {
    public List<Bar> getSomeStuff() {
            List<Bar> bar = new ArrayList<Bar>;

            final ExecutorService threadpool = Executors.newFixedThreadPool(10);

            //Get the stuff in multithreaded way.
            threadpool.shutdown();
            return bar;
        };
    }
}
Run Code Online (Sandbox Code Playgroud)

或者

public class FooBarClass {

    final ExecutorService threadpool = Executors.newFixedThreadPool(10); 

    public List<Bar> getSomeStuff() {
            //...
            //Get the stuff using the executor service.
            return bar;
        };
    }


}
Run Code Online (Sandbox Code Playgroud)

我发现使用 executor 服务肯定会加速代码。我们正在执行类似批处理的提取,但由于某些原因我们需要进行单次提取,因此所有提取都是异步的。

Mic*_*ael 5

这真的取决于。

假设每个服务都有自己的 10 个线程池,假设有 50 个服务,总共有 500 个线程。

当您有大量线程时(不是 500 就一定很大),很可能它们中的大多数在大部分时间都处于空闲状态,这是相当浪费的。线程有开销,它们之间的上下文切换相对较慢。

如果每个服务都有自己的池,那么可能会出现一个服务的池完全耗尽,任务队列巨大,而其他执行器完全空闲的情况。在这些情况下,池可以合作并共享资源会更好。这是共享公共池的服务的情况。

不过,与其他服务的隔离有时是好的。任务具有不同的优先级,您不希望琐碎的低优先级作业消耗所有线程,而让高优先级作业在队列中等待。这是每个服务都有自己的池的情况。

在实践中,我发现最好的方法是在中间的某个地方。有些服务是高优先级的,我不希望它们受到应用程序其他地方发生的事情的影响。我为这些类型的服务提供了一个专用的线程池。其他服务优先级不高,我不在乎任务提交和执行之间是否有小延迟。对于那些,我让它们共享一个公共线程池。