java - 关闭执行器服务中的线程而不关闭它

标签 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(){......}}

最佳答案

Can anyone show me how to close all the threads which executed successfully without shutting down ExecutorService.

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

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

<小时/>

P.S.,您的 Thread1扩展了 Thread。这是一个坏习惯,它会导致您以一种不太有用的方式来思考线程。考虑线程和执行器的正确方法是,线程或执行器只是执行您提供的一段或多段代码的东西。仅此而已。

我见过很多问题,比如“我需要 X 线程来做 Y,但是……”,导致他们陷入麻烦的是开发人员给了 X 线程太多< em>职责。

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

<小时/>

更新:

Can you suggest any method to close the threads without shutting down executor service.

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

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

关于java - 关闭执行器服务中的线程而不关闭它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35944951/

相关文章:

java - 使用静态方法比导入整个类便宜吗?

java - 自动编译线程类中的类。请解释

java - 为什么同步块(synchronized block)比同步方法更好?

java - 在多个线程中更新 AtomicInteger 变量时未获得预期结果

java - 来自 C++ 的 JNI 调用、FindClass 和导入

java - MongoDB 中基于日期排序

java - 如何让我的 Java 应用程序在连接时向 Oracle 标识自己?

C++ 打印/cout 在多线程中重叠?

multithreading - 使用 atomic_init 而不是 atomic_store 有什么优势吗?

python gevent, zeromq, and ultramysql - 脑痛