所有任务完成后 spring boot 应用程序不退出

Raz*_*zor 6 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 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

方法 -

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));
    }
}
Run Code Online (Sandbox Code Playgroud)

即使读取所有文件后,应用程序也不会终止但是当我使用

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

应用程序终止并且所有线程都被终止。

当我使用-

SpringApplication.run(Application.class, args).close();

即使应用程序这么说之后,线程仍然继续运行 -

org.springframework.context.annotation.AnnotationConfigApplicationContext@6eda5c9:启动日期 [Mon Aug 15 04:42:02 IST 2016];上下文层次结构的根 2016-08-15 04:42:05.390 INFO 36600 --- [ main] osjeaAnnotationMBeanExporter :在关闭时取消注册 JMX 暴露的 beans

然后我必须手动终止该应用程序。应用程序退出并显示代码 130

有人可以帮我找到一种优雅地关闭应用程序的方法吗?

谢谢

Mil*_*vić 2

首先,您没有ExecutorService正确关闭,您的multiThreadTest应该如下所示:

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();
}
Run Code Online (Sandbox Code Playgroud)