【问题标题】:Closing Threads in Executor Service without shutting it down关闭执行器服务中的线程而不关闭它
【发布时间】:2016-06-26 23:27:38
【问题描述】:

我的执行器服务代码如下所示。我正在执行多个线程。但是由于某些原因,程序没有退出,因为根据日志有一些线程处于等待状态。如果我使用 Thread.start(),那么我就没有这个问题。我只有在使用 ExecutorService 时才会遇到问题。谁能告诉我如何在不关闭 ExecutorService 的情况下关闭所有成功执行的线程。

class ExecutorExample{
    public static void main(){
        File folder = new File("/home/agasthyt/agasthyt");
        File[] listOfFiles = folder.listFiles();
        for (int i = 0; i < listOfFiles.length; i++) {
            Thread1 thread1=new Thread1(listOfFiles[i]);
            es.execute(thread1);
    }
  }
}

类 Thread1 扩展 Thread{public void run(){......}}

【问题讨论】:

  • 如果您不需要线程返回(我认为您这样做),您可以将它们设置为守护进程。
  • 不,看起来shutdown() 是必需的。你必须调用它。

标签: java multithreading concurrency


【解决方案1】:

谁能告诉我如何在不关闭 ExecutorService 的情况下关闭所有成功执行的线程。

这不是ExecutorService 的用途。当你创建一个 ExecutorService 时,你给它tasks 去执行,你让 管理它用来执行你的任务的线程。你不应该知道或关心它使用的线程。

当您不再需要它时(例如,当您想终止程序时),则将其关闭。


P.S.,您的 Thread1 班级 extends Thread。这是一个坏习惯,它会导致你以一种不太有用的方式来思考线程。思考线程和执行器的正确方法是,线程或执行器就是执行你给它的一些或几段代码的东西。仅此而已。

我见过很多问题,比如“我需要 X 线程来做 Y,但是......”,而导致他们陷入困境的是开发人员给 X 线程太多了 责任。

在设计良好的程序中,哪个线程执行 Y 无关紧要。线程应该是匿名的和可互换的。


更新:

您能否建议任何方法来关闭线程而不关闭执行程序服务。

不,我不能。如果线程是由 ExecutorService 创建的,那么你的程序在背后杀死这些线程是错误的。

问:你使用什么类来实现ExecutorService?也许是ThreadPoolExecutor?也许您可以通过创建一个生成 daemon 线程的ThreadFactory 来解决您的问题,然后使用该工厂构造您的ThreadPoolExecutor。守护线程不会阻止程序退出。

【讨论】:

  • 你说的完全正确。这只是一个示例程序。很少有线程进入等待。因此程序不会退出。您能否建议任何方法来关闭线程而不关闭执行程序服务,因为我需要相同的执行程序服务来执行其他线程。
  • 如果我调用 es.execute(),即使在线程完成执行后也会出现一个小问题,它会被发送到等待状态。当我看到堆栈跟踪时,它类似于 sun.misc.unsafe.park,这就是为什么我需要在不关闭执行程序服务的情况下关闭它,因为我稍后会使用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-27
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
相关资源
最近更新 更多