在我開始一個 SpringBoot web 專案之后。我找不到使用jcmd $pid Thread.print. 我也找不到使用hsdb. main執行緒去哪兒了?
uj5u.com熱心網友回復:
我不知道您用于創建 Spring Boot 專案的工具,但如果您通過Spring Initializr( https://start.spring.io/ ) 創建它,它應該在路徑上YOUR_PROJECT_NAME/src/main/java/YOUR_PERSONALIZED_PATH/。
創建/執行的檔案的名稱main thread應該在該路徑內,并且應該被稱為YOUR_PROJECT_NAME Application.java.
uj5u.com熱心網友回復:
對于大多數 Spring Boot 應用程式,SpringApplication::run涉及啟動 Web 服務器(Tomcat、Undertow、Jetty、Netty)。這些服務器創建自己的非守護執行緒。對 then的呼叫SpringApplication::run回傳并且主執行緒退出。然后,VM 由其他非守護執行緒保持活動狀態——確切的名稱取決于所使用的 Web 服務器。
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
uj5u.com熱心網友回復:
Web 應用程式將 main 方法委托給SpringApplication.run,它將執行 Spring 初始化和其他程序。Spring初始化完成后,main方法的生命周期就結束了。
為什么沒有main方法java行程不退出?
java.c
/* Build platform specific argument array */
mainArgs = CreateApplicationArgs(env, argv, argc);
CHECK_EXCEPTION_NULL_LEAVE(mainArgs);
/* Invoke main method. */
(*env)->CallStaticVoidMethod(env, mainClass, mainID, mainArgs);
/*
* The launcher's exit code (in the absence of calls to
* System.exit) will be non-zero if main threw an exception.
*/
ret = (*env)->ExceptionOccurred(env) == NULL ? 0 : 1;
LEAVE();
#define LEAVE() \
do { \
if ((*vm)->DetachCurrentThread(vm) != JNI_OK) { \
JLI_ReportErrorMessage(JVM_ERROR2); \
ret = 1; \
} \
if (JNI_TRUE) { \
(*vm)->DestroyJavaVM(vm); \
return ret; \
} \
} while (JNI_FALSE)
因為在leave宏定義的注釋中有說明。
始終分離主執行緒,以便在應用程式的 main 方法退出時它似乎已經結束。如果 main 拋出例外,這將呼叫未捕獲的例外處理程式機制。未捕獲的例外處理程式不能更改啟動器的回傳碼,除非呼叫 System.exit。等待所有非守護執行緒結束,然后銷毀 VM。這實際上將創建一個名為“DestroyJavaVM”的簡單的新 Java 服務程式執行緒,但這將被視為與執行 main 的執行緒不同的執行緒,即使它們是同一個 C 執行緒。這允許 mainThread.join() 和 mainThread.isAlive() 按預期作業。
在這種情況下,行程具有非守護執行緒,因此行程不會退出。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/513227.html
標籤:弹簧靴弹簧MVC
