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