Java 所有任务完成后,spring引导应用程序不会退出

Java 所有任务完成后,spring引导应用程序不会退出,java,spring,multithreading,spring-boot,Java,Spring,Multithreading,Spring Boot,这是我的申请课- @EnableAutoConfiguration @SpringBootApplication @Configuration public class Application implements CommandLineRunner { private static final Logger log = LoggerFactory.getLogger(Application.class); @Autowired private ITestService3 testServic

这是我的申请课-

@EnableAutoConfiguration
@SpringBootApplication
@Configuration
public class Application implements CommandLineRunner {
private static final Logger log = LoggerFactory.getLogger(Application.class);

@Autowired
private ITestService3 testService3;

public static void main(String[] args) {
    System.exit(SpringApplication.exit(SpringApplication.run(Application.class, args)));

    @Override
    public void run(String... strings) throws Exception {
        testService3.multiThreadTest();
    }
}
方法-

public void multiThreadTest() {
    ThreadPoolExecutor readExecutor = (ThreadPoolExecutor) Executors.newFixedThreadPool(10);
    List<String> files = listFiles(new File("/Users/admin/filesList"), new ArrayList<>());
    for (String file : files) {
        readExecutor.execute(new FileParser(file));
    }
}
public void多线程测试(){
ThreadPoolExecutor readExecutor=(ThreadPoolExecutor)Executors.newFixedThreadPool(10);
列表文件=列表文件(新文件(“/Users/admin/filesList”)、新ArrayList();
用于(字符串文件:文件){
execute(新文件解析器(文件));
}
}
即使读取了所有文件,应用程序也不会终止 但是当我使用

exit(SpringApplication.exit(SpringApplication.run(Application.class,args))

应用程序被终止,所有线程被终止

当我使用-

run(Application.class,args.close()

即使在应用程序执行以下操作后,线程仍会继续运行-

org.springframework.context.annotation。AnnotationConfigApplicationContext@6eda5c9:启动日期【2016年8月15日星期一04:42:02 IST】;上下文层次结构的根 2016-08-15 04:42:05.390信息36600---[main]o.s.j.e.a.注释MBeanExporter:在关机时注销JMX暴露的bean

然后我必须手动终止应用程序。应用程序以代码130退出

有人能帮我一个方法,优雅地关闭应用程序


谢谢

首先,您没有正确关闭
ExecutorService
,您的
多线程测试应该如下所示:

public void multiThreadTest() throws InterruptedException {
    ThreadPoolExecutor readExecutor = (ThreadPoolExecutor) Executors.newFixedThreadPool(10);
    List<String> files = listFiles(new File("/Users/admin/filesList"), new ArrayList<>());
    for (String file : files) {
        readExecutor.execute(new FileParser(file));
    }

    readExecutor.shutdown();
    readExecutor.awaitTermination(5, TimeUnit.MINUTES); // wait for tasks to complete
    readExecutor.shutdownNow();
}
public void multi-threadtest()引发InterruptedException{
ThreadPoolExecutor readExecutor=(ThreadPoolExecutor)Executors.newFixedThreadPool(10);
列表文件=列表文件(新文件(“/Users/admin/filesList”)、新ArrayList();
用于(字符串文件:文件){
execute(新文件解析器(文件));
}
readExecutor.shutdown();
readExecutor.awaitTermination(5,TimeUnit.MINUTES);//等待任务完成
readExecutor.shutdownNow();
}

我的应用程序运行时间很长。也可能是几天。在这种情况下,如何设置-readExecutor.awaitTermination(5,TimeUnit.MINUTES);您可以使用
DAYS
time unit-
readExecutor.awaitTermination(5,TimeUnit.DAYS)
您实际上不需要最后两行-
awaitTermination
shutdownNow
,但对任务可以运行的时间设定阈值是一种很好的做法。