Java Thread中的System.exit

Doz*_*zer 6 java multithreading

我的主线程创建了一个新线程.当新线程调用时System.exit(-1),我的主线程被关闭.如何处理退出代码并保持主线程活动?

PS.新线程会在其他.jar文件中调用一些方法,所以我无法修改它.

Thi*_*ara 5

你不能.

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.不只是线程....


bes*_*sss 5

您的问题非常不清楚,但如果System.exit调用成功,操作系统将终止您的应用程序.

如果您希望System.exit不成功,您可以安装安全管理器并阻止它.除此之外,您可以通过自定义类加载器检测代码并删除调用.

编辑:如果你去安全管理器,很可能抛出SecurityException将终止线程.如果没有 - 作弊并抛出一个ThreadDeath.如果仍然没有 - 只需保持线程,例如for(;;) Thread.sleep(10000);后者将泄漏线程及其资源,但至少不会杀死您的应用程序.

链接到类似的问题


Doz*_*zer 3

班上:

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


在启动时:

System.setSecurityManager(new MySecurityManager());
Run Code Online (Sandbox Code Playgroud)