如何与 NewFixedThreadPool 共享线程池

How to share threadpools with NewFixedThreadPool

我有一个服务方法,它需要并行调用三个方法,如下所示,以使 ServiceMethod() 运行 更快。

public void ServiceMethod()
{
    ExecutorService executorService = Executors.newFixedThreadPool(10);
    executorService.execute(new Runnable() {
    public void run() {
        System.out.println("Asynchronous task");
    }
});
executorService.shutdown();
}

另外我想提一下,ServiceMethod()可能同时被1000个客户端调用,下面是我的困惑。

  1. 如果ServiceMethod()被调用1000次,那么我们会创建1000个不同的Threadpool,每个Threadpool包含10个线程,所以会有10,000个线程?并且没有机会重用线程?

  2. 如果我移动

    怎么样
    ExecutorService executorService = Executors.newFixedThreadPool(10);
    

    从方法范围到 class 级别

    static ExecutorService executorService = Executors.newFixedThreadPool(10);
    

    ?用静态变量?那么所有1000个客户端共享10个线程,只有在这种情况下,线程才会被重用?

你说得对。为每个请求创建和销毁 ExecutorService 非常浪费且不可扩展。即使考虑到线程在关闭和释放执行程序时被销毁(因此,您可能不会同时拥有 10,000 个线程),在请求到达时创建和启动新线程仍然太昂贵。

常见的方法是拥有一个共享的执行器,该执行器具有适当数量的线程,所有请求都使用该线程来提交任务。不过,执行者不必是静态的。如果您只有一个对象来处理所有请求,只需将其设为一个简单的 class 字段即可。