我的执行程序服务代码如下所示 . 我正在执行多个线程 . 但由于某些原因,程序没有退出,因为根据日志有一些线程处于等待状态 . 如果我使用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);
}
}
}
class Thread1 extends Thread {public void run()}
1 回答
这不是
ExecutorService
的用途 . 创建ExecutorService时,您需要为其执行任务,并让它管理它用于执行任务的线程 . 您不应该知道或关心它使用的线程 .如果您不再需要它(例如,当您想要终止程序时),则将其关闭 .
P.S.,你的
Thread1
班extends Thread
. 这是一个坏习惯,会让你陷入一种不太有用的思考线程的方式 . 思考线程和执行程序的正确方法是,线程或执行程序只是执行您提供的一些代码或代码片段 . 而已 .我引起他们麻烦的是开发人员给了X线程太多的责任 .
在一个设计良好的程序中,Y应该是哪个线程并不重要 . 线程应该是匿名的和可互换的 .
Update:
不,我不能 . 如果线程是由ExecutorService创建的,那么你的程序杀掉它背后的那些线程是错误的 .
Q: 您使用哪个类实现
ExecutorService
?这可能是ThreadPoolExecutor
吗?也许您可以通过创建一个生成守护程序线程的ThreadFactory
来解决您的问题,然后使用该工厂构建您的ThreadPoolExecutor
. 守护程序线程不会阻止程序退出 .