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
,但对任务可以运行的时间设定阈值是一种很好的做法。