如何与NewFixedThreadPool共享线程池

时间:2016-08-26 08:20:26

标签: java multithreading threadpoolexecutor

我有一个服务方法,需要并行调用三个方法,如下所示,以使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,每个都包含10个线程,所以会有10,000个线程?并且线程不可能被重用?

  2. 如果我移动了

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

    从方法范围到类级别

    static ExecutorService executorService = Executors.newFixedThreadPool(10);
    

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

1 个答案:

答案 0 :(得分:1)

你是对的。为每个请求创建和销毁ExecutorService都是非常浪费且不可扩展的。即使考虑到当你关闭并释放执行程序时线程被破坏的事实(所以,你可能不会同时拥有10,000个线程),但是当创建和启动新线程时,它仍然太昂贵了。请求到达。

常见的方法是让一个共享执行程序具有相当数量的线程,所有请求都使用这些线程来提交任务。虽然,遗嘱执行人不必是静态的。如果您有一个处理所有请求的对象,只需将其设为一个简单的类字段即可。