我正在为我的公司开发一个无GUI的桌面应用程序,该应用程序计划始终在后台运行(通过HtmlUnit从网站检索信息)并更新数据库中的某些行。 我正在使用ExecutorService提交加载网站的任务,因此可以设置超时。这样:
private ExecutorService taskExecutor = Executors.newFixedThreadPool(1);
private long timeout = 60000L;
private Page loadSite(Loader<Page> c) {
Page page;
Future<Page> result = taskExecutor.submit(c);
try {
page = result.get(timeout, TimeUnit.MILLISECONDS);
} catch (TimeoutException | ExecutionException | InterruptedException ex) {
close();
result.cancel(true);
throw new HandledWebException(ex);
}
return page.getEnclosingWindow().getEnclosedPage();
}
问题是:
taskExecutor
对象是否能够在submit
调用之前安排任务,并在必要时重新实例化它? (延长的执行时间似乎对我构成威胁)taskExecutor
并重新实例化?答案 0 :(得分:0)
1)我是否应该检查taskExecutor对象是否能够在提交调用之前安排任务,并在必要时重新实例化?
2)如果提交的任务未能完成,我是否必须关闭并重新实例化taskExecutor?
对于这两个问题都不需要
公共静态ExecutorService newFixedThreadPool(int nThreads)
创建一个线程池,该线程池重用在共享的无边界队列上运行的固定数量的线程。在任何时候,最多nThreads个线程都是活动的处理任务。如果在所有线程都处于活动状态时提交了其他任务,则它们将在队列中等待,直到某个线程可用为止。 如果在关闭之前执行过程中由于执行失败导致任何线程终止,则在执行后续任务时将使用新线程代替。池中的线程将一直存在,直到被明确关闭为止。