[英]System.exit in Java Thread
我的主線程創建了一個新線程當新線程調用System.exit(-1)
,我的主線程被關閉。 如何處理退出代碼並保持主線程活動?
PS。 新線程會調用其他.jar
文件中的某些方法,所以我無法修改它。
你不能。
Terminates the currently running Java Virtual Machine. The argument serves as a status code; by convention, a nonzero status code indicates abnormal termination.
這就是javadoc。
因此該方法將終止整個JVM。 不只是線程....
您的問題非常不清楚,但如果System.exit調用成功,操作系統將終止您的應用程序。
如果您希望System.exit不成功,您可以安裝安全管理器並阻止它。 除此之外,您可以通過自定義類加載器檢測代碼並刪除調用。
編輯:如果你去安全管理器,很可能拋出SecurityException將終止線程。 如果沒有 - 作弊並拋出一個ThreadDeath。 如果仍然沒有 - 只需保持線程例如for(;;) Thread.sleep(10000);
后者會泄漏線程及其資源,但至少不會殺死你的應用程序。
班級:
public class MySecurityManager extends SecurityManager {
@Override
public void checkPermission(Permission perm) {
}
@Override
public void checkPermission(Permission perm, Object context) {
}
@Override
public void checkCreateClassLoader() {
}
@Override
public void checkAccess(Thread t) {
}
@Override
public void checkAccess(ThreadGroup g) {
}
@Override
public void checkExit(int status) {
throw new SecurityException("not allow to call System.exit");
}
@Override
public void checkExec(String cmd) {
}
@Override
public void checkLink(String lib) {
}
@Override
public void checkRead(FileDescriptor fd) {
}
@Override
public void checkRead(String file) {
}
@Override
public void checkRead(String file, Object context) {
}
@Override
public void checkWrite(FileDescriptor fd) {
}
@Override
public void checkWrite(String file) {
}
@Override
public void checkDelete(String file) {
}
@Override
public void checkConnect(String host, int port) {
}
@Override
public void checkConnect(String host, int port, Object context) {
}
@Override
public void checkListen(int port) {
}
@Override
public void checkAccept(String host, int port) {
}
@Override
public void checkMulticast(InetAddress maddr) {
}
@Override
public void checkPropertiesAccess() {
}
@Override
public void checkPropertyAccess(String key) {
}
@Override
public boolean checkTopLevelWindow(Object window) {
return super.checkTopLevelWindow(window);
}
@Override
public void checkPrintJobAccess() {
}
@Override
public void checkSystemClipboardAccess() {
}
@Override
public void checkAwtEventQueueAccess() {
}
@Override
public void checkPackageAccess(String pkg) {
}
@Override
public void checkPackageDefinition(String pkg) {
}
@Override
public void checkSetFactory() {
}
@Override
public void checkMemberAccess(Class<?> clazz, int which) {
}
@Override
public void checkSecurityAccess(String target) {
}
}
在startop上:
System.setSecurityManager(new MySecurityManager());
使用Java SecurityManager保存主線程退出並使用SecurityManager運行其他線程代碼。
編輯:從Tomcat或其他服務器獲取想法如何管理代碼,如<% System.exit(1); %>
<% System.exit(1); %>
這在JSP中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.