【问题标题】:When to shutdown Fixed Thread Pool executer in Java?何时关闭 Java 中的固定线程池执行器?
【发布时间】:2022-01-18 23:45:16
【问题描述】:

我有一个 JSP 应用程序,其中一个网页一个一个地调用五个方法(它们都从不同的来源获取数据)并根据数据显示图表。
为了快速加载网页,我计划在 FixedThreadPool Executor 的帮助下并行调用所有五个方法。
一旦我从所有五种方法中获得结果,我应该关闭我的执行程序吗?在我看来,关闭执行器是个坏主意,因为如果有人第二次打开网页,它将需要执行器再次初始化才能并行调用这五个方法。
但是,我不确定让执行程序处于打开状态的后果,因此不知道如何继续。

【问题讨论】:

    标签: java multithreading concurrency thread-safety threadpool


    【解决方案1】:

    保持打开状态是使用线程池的正常方式。这就是线程池的全部意义所在:它是为了防止您的应用程序在每次需要加载页面时都必须创建然后销毁许多新线程。相反,它可以一次又一次地使用相同的线程。

    【讨论】:

      【解决方案2】:

      在《Java 并发实战》第 7 章中就有这样一个例子,其中提出了一种所谓的一次性执行服务:

      如果一个方法需要处理一批任务并且直到所有任务都没有返回 任务完成后,它可以通过使用私有的来简化服务生命周期管理 其生命周期受该方法限制的 Executor。

      其代码示例:

      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();
      }
      

      我建议使用这种方法简化您的代码。

      【讨论】:

      • 嗨@w_n,我认为我的用例有点不同。一旦所有任务完成,执行器将在此处关闭。即使任务完成,我也希望线程在那里,这样当其他用户打开应用程序时,不需要创建单独的线程。
      • 我认为,正如 Solomon 在第一个答案中所建议的那样,使用线程池并让它在整个应用程序生命周期中保持打开状态是前进的方向。
      猜你喜欢
      • 2015-03-05
      • 2014-08-27
      • 2017-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-29
      • 2014-08-07
      • 2011-09-30
      相关资源
      最近更新 更多