Java 何时关闭固定线程池执行器?
When to shutdown Fixed Thread Pool executer in Java?
我有一个JSP应用程序,其中一个网页一个一个调用五个方法(它们都从不同的来源获取数据)并根据数据显示图表。
为了快速加载网页,我打算在 FixedThreadPool Executor 的帮助下并行调用所有五个方法。
一旦我从所有五种方法中获得结果,我是否应该关闭我的执行程序?关闭执行器在我看来是个坏主意,因为如果有人第二次打开网页,将需要执行器再次初始化才能并行调用五个方法。
但是,我不确定让执行程序保持打开状态的后果,因此不确定如何进行。
保持打开状态是使用线程池的正常方式。这就是线程池的全部要点:它是为了防止您的应用程序每次需要加载页面时都必须创建然后销毁许多新线程。相反,它可以一次又一次地使用相同的线程。
在“Java 并发实践”的第 7 章中有一个这样的例子,其中提出了所谓的一次性执行服务:
If a method needs to process a batch of tasks and does not return until all the
tasks are finished, it can simplify service lifecycle management by using a private
Executor whose lifetime is bounded by that method.
其代码示例:
boolean checkMail(Set<String> hosts, long timeout, TimeUnit unit)
throws InterruptedException {
ExecutorService exec = Executors.newCachedThreadPool();
final AtomicBoolean hasNewMail = new AtomicBoolean(false);
try {
for (final String host : hosts)
exec.execute(new Runnable() {
public void run() {
if (checkMail(host))
hasNewMail.set(true);
}
});
} finally {
exec.shutdown();
exec.awaitTermination(timeout, unit);
}
return hasNewMail.get();
}
我建议使用这种方法简化您的代码。
我有一个JSP应用程序,其中一个网页一个一个调用五个方法(它们都从不同的来源获取数据)并根据数据显示图表。
为了快速加载网页,我打算在 FixedThreadPool Executor 的帮助下并行调用所有五个方法。
一旦我从所有五种方法中获得结果,我是否应该关闭我的执行程序?关闭执行器在我看来是个坏主意,因为如果有人第二次打开网页,将需要执行器再次初始化才能并行调用五个方法。
但是,我不确定让执行程序保持打开状态的后果,因此不确定如何进行。
保持打开状态是使用线程池的正常方式。这就是线程池的全部要点:它是为了防止您的应用程序每次需要加载页面时都必须创建然后销毁许多新线程。相反,它可以一次又一次地使用相同的线程。
在“Java 并发实践”的第 7 章中有一个这样的例子,其中提出了所谓的一次性执行服务:
If a method needs to process a batch of tasks and does not return until all the tasks are finished, it can simplify service lifecycle management by using a private Executor whose lifetime is bounded by that method.
其代码示例:
boolean checkMail(Set<String> hosts, long timeout, TimeUnit unit)
throws InterruptedException {
ExecutorService exec = Executors.newCachedThreadPool();
final AtomicBoolean hasNewMail = new AtomicBoolean(false);
try {
for (final String host : hosts)
exec.execute(new Runnable() {
public void run() {
if (checkMail(host))
hasNewMail.set(true);
}
});
} finally {
exec.shutdown();
exec.awaitTermination(timeout, unit);
}
return hasNewMail.get();
}
我建议使用这种方法简化您的代码。