簡體   English   中英

Java Thread中的System.exit

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM