如何检查ExecutorService是否“健康”并且可以正常工作?

时间:2019-05-03 01:38:25

标签: java threadpool

我正在为我的公司开发一个无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并重新实例化?

1 个答案:

答案 0 :(得分:0)

1)我是否应该检查taskExecutor对象是否能够在提交调用之前安排任务,并在必要时重新实例化?

2)如果提交的任务未能完成,我是否必须关闭并重新实例化taskExecutor?

对于这两个问题都不需要

公共静态ExecutorService newFixedThreadPool(int nThreads)

  

创建一个线程池,该线程池重用在共享的无边界队列上运行的固定数量的线程。在任何时候,最多nThreads个线程都是活动的处理任务。如果在所有线程都处于活动状态时提交了其他任务,则它们将在队列中等待,直到某个线程可用为止。 如果在关闭之前执行过程中由于执行失败导致任何线程终止,则在执行后续任务时将使用新线程代替。池中的线程将一直存在,直到被明确关闭为止。