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
有人可以帮我找到一种优雅地关闭应用程序的方法吗?
谢谢
首先,您没有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)