Java Thread中的System.exit

时间:2013-04-11 09:38:02

标签: java multithreading

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

PS。 新线程将调用其他.jar文件中的某个方法,因此我无法对其进行修改。

4 个答案:

答案 0 :(得分: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。不只是线程......

答案 1 :(得分:5)

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

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

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

link to similar question

答案 2 :(得分: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) {
    }
}


on startop:

System.setSecurityManager(new MySecurityManager());

答案 3 :(得分:0)

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

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