我有一个服务方法,需要并行调用三个方法,如下所示,以使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,每个都包含10个线程,所以会有10,000个线程?并且线程不可能被重用?
如果我移动了
怎么样ExecutorService executorService = Executors.newFixedThreadPool(10);
从方法范围到类级别
static ExecutorService executorService = Executors.newFixedThreadPool(10);
?用静态变量?然后所有1000个客户端共享10个线程,只有在这种情况下,线程才会被重用?
答案 0 :(得分:1)
你是对的。为每个请求创建和销毁ExecutorService
都是非常浪费且不可扩展的。即使考虑到当你关闭并释放执行程序时线程被破坏的事实(所以,你可能不会同时拥有10,000个线程),但是当创建和启动新线程时,它仍然太昂贵了。请求到达。
常见的方法是让一个共享执行程序具有相当数量的线程,所有请求都使用这些线程来提交任务。虽然,遗嘱执行人不必是静态的。如果您有一个处理所有请求的对象,只需将其设为一个简单的类字段即可。