【问题标题】:How to shutdown the ThreadServiceExecutor where the number of threads is not initially known [duplicate]如何在最初不知道线程数的情况下关闭 ThreadServiceExecutor [重复]
【发布时间】:2017-04-28 13:37:24
【问题描述】:

我正在编写代码,每当遇到文件夹时,它都应该启动一个新线程。代码看起来像, p

ublic void diff(File x,File y){
    ThreadPoolExecutor executor=new ThreadPoolExecutor(10,30,2000,unit,BlockingQueue<Runnable> queue)
    if(x.isDirecotry && y.isDirectory){
      Runnable thread=new DThread(x,y);
        Future<?> result=executor.submit(thread);
        if(result.isDone()){
            LOGGER.debug(thread.toString()+"has completed");
        }

我为此目的使用 ThreadPoolExecutor。如果我关闭 ThreadPoolExecutor,那么它不会占用任何新线程。但是有可能在启动后启动新线程。如果我不关闭 ThreadPoolExecutor,那么所有线程都会被执行,但最终 JVM 并没有终止。 请帮助我如何仅在执行所有线程以使 JVM 终止时才关闭线程池。还建议是否有更好的线程池实现方式。我想使用线程池,这样我就可以使用池中的线程,而不是每次都创建新线程。

【问题讨论】:

  • 链接问题中提供了更好的答案。 ThreadPoolExecutor 是一个 ExecutorService

标签: java multithreading pool threadpoolexecutor


【解决方案1】:

您提交的内容不应是线程(线程的子类型)。它们应该是简单的任务:RunnableCallable 的实现。

关闭执行器的方法是在其上调用shutdown()shutdownNow()。 javadoc 摘要说:

void shutdown() - 启动有序关闭,执行之前提交的任务,但不会接受新任务。

List&lt;Runnable&gt; shutdownNow() - 尝试停止所有正在执行的任务,停止等待任务的处理,并返回等待执行的任务列表。

后者试图通过中断任务来停止它们。但是,如果任务代码不检查中断,它将运行到完成。 (它也停止接受新任务。)


听起来shutdown() 做了你想做的事。


问题在于我应该在哪里放置关闭方法。

当你想开始关机时调用它。

因为有可能在调用关闭后新线程可能会到来。

停止调用它们线程。它们是任务

在调用shutdown() 之后提交的任何任务都会被拒绝。

我的问题是如何检查所有 任务 是否已完成执行,然后才调用关机。如果我在每个 task 的启动时调用,那么以后它将不允许新的 tasks

调用shutdown() 的正确时间是您的应用程序完成向执行程序提交任务的时间。

也许您的概念问题是执行程序服务的范围。您的示例代码似乎表明每次调用 diff 都会创建一个新的服务对象。这意味着您将拥有许多独立的线程池......并且不会重用线程。您应该真正做的是创建一个“全局”线程池并多次调用diff 将任务提交到同一个池。

【讨论】:

  • 它做我想要的。我没有使用线程。我正在使用 Runnable 实现。问题在于我应该在哪里放置关闭方法。因为在调用shutdown 之后可能会出现新线程。我的问题是如何检查所有线程是否已完成执行,然后才调用关闭。如果我在启动每个线程时调用,那么以后将不允许新线程。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-26
  • 2021-11-23
  • 2019-02-24
  • 2011-05-30
  • 2019-04-14
  • 2011-10-05
  • 2021-07-19
相关资源
最近更新 更多