如何与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个不同的线程池,每个线程池将包含10个线程,那么将有10,000个线程?线程没有机会被重用吗?

  2. 如果我移动

    ExecutorService executorService = Executors.newFixedThreadPool(10);
    
    用 将

    从方法作用域转移到类级别

    static ExecutorService executorService = Executors.newFixedThreadPool(10);
    

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

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

常见的方法是使用单个共享执行器,其中包含适当数量的线程,所有请求都使用这些线程来提交任务。但是,执行器不必是静态的。如果你有一个单独的对象来处理所有的请求,那就把它变成一个简单的类字段。

最新更新