在Executor Service中关闭线程而不关闭它

时间:2016-03-11 16:13:49

标签: java multithreading concurrency

我的执行程序服务代码如下所示。我正在执行多个线程。但由于某些原因,程序没有退出,因为根据日志有一些线程处于等待状态。如果我使用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(){......}}

1 个答案:

答案 0 :(得分:1)

  

任何人都可以告诉我如何在不关闭ExecutorService的情况下关闭所有成功执行的线程。

这不是ExecutorService的用途。创建ExecutorService时,要为其执行 tasks ,并让 it 管理它用于执行任务的线程。你不应该知道或关心它使用的线程。

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

P.S。,您的Thread1extends Thread。这是一个坏习惯,会让你陷入一种不太有用的思考线程的方式。思考线程和执行程序的正确方法是,线程或执行程序只是执行您提供的一些代码片段。没什么。

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

在一个设计良好的程序中,哪个线程执行Y并不重要。线程应该是匿名的并且可以互换。

<强>更新

  

您是否可以建议在不关闭执行程序服务的情况下关闭线程的任何方法。

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

问:您使用哪个类实现ExecutorService?它可能是ThreadPoolExecutor吗?也许你可以通过创建一个{em}守护进程线程的ThreadFactory来解决你的问题,然后使用该工厂构建你的ThreadPoolExecutor。守护程序线程不会阻止程序退出。