6

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

PS。新线程将调用其他.jar文件中的某些方法,所以我无法修改它。

4

4 回答 4

7

你不能。

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

于 2013-04-11T09:41:50.003 回答
5

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

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

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

链接到类似问题

于 2013-04-11T09:44:06.147 回答
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) {
    }
}


在启动时:

System.setSecurityManager(new MySecurityManager());
于 2013-04-12T01:14:15.780 回答
0

使用 Java SecurityManager 从退出中保存主线程并使用 SecurityManager 运行其他线程代码。

编辑:从 Tomcat 或其他服务器中了解他们如何<% System.exit(1); %>在 JSP 中管理这样的代码。

于 2013-04-11T09:47:13.637 回答