如何与 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个客户端调用,下面是我的困惑。
如果ServiceMethod()
被调用1000次,那么我们会创建1000个不同的Threadpool,每个Threadpool包含10个线程,所以会有10,000个线程?并且没有机会重用线程?
如果我移动
怎么样
ExecutorService executorService = Executors.newFixedThreadPool(10);
从方法范围到 class 级别
static ExecutorService executorService = Executors.newFixedThreadPool(10);
?用静态变量?那么所有1000个客户端共享10个线程,只有在这种情况下,线程才会被重用?
你说得对。为每个请求创建和销毁 ExecutorService
非常浪费且不可扩展。即使考虑到线程在关闭和释放执行程序时被销毁(因此,您可能不会同时拥有 10,000 个线程),在请求到达时创建和启动新线程仍然太昂贵。
常见的方法是拥有一个共享的执行器,该执行器具有适当数量的线程,所有请求都使用该线程来提交任务。不过,执行者不必是静态的。如果您只有一个对象来处理所有请求,只需将其设为一个简单的 class 字段即可。
我有一个服务方法,它需要并行调用三个方法,如下所示,以使 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个客户端调用,下面是我的困惑。
如果
ServiceMethod()
被调用1000次,那么我们会创建1000个不同的Threadpool,每个Threadpool包含10个线程,所以会有10,000个线程?并且没有机会重用线程?如果我移动
怎么样ExecutorService executorService = Executors.newFixedThreadPool(10);
从方法范围到 class 级别
static ExecutorService executorService = Executors.newFixedThreadPool(10);
?用静态变量?那么所有1000个客户端共享10个线程,只有在这种情况下,线程才会被重用?
你说得对。为每个请求创建和销毁 ExecutorService
非常浪费且不可扩展。即使考虑到线程在关闭和释放执行程序时被销毁(因此,您可能不会同时拥有 10,000 个线程),在请求到达时创建和启动新线程仍然太昂贵。
常见的方法是拥有一个共享的执行器,该执行器具有适当数量的线程,所有请求都使用该线程来提交任务。不过,执行者不必是静态的。如果您只有一个对象来处理所有请求,只需将其设为一个简单的 class 字段即可。