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