我的主线程创建了一个新线程,当新线程调用时System.exit(-1)
,我的主线程被关闭。如何处理退出代码并保持主线程处于活动状态?
PS。新线程将调用其他.jar
文件中的某些方法,所以我无法修改它。
我的主线程创建了一个新线程,当新线程调用时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) {
}
}
在启动时:
System.setSecurityManager(new MySecurityManager());
使用 Java SecurityManager 从退出中保存主线程并使用 SecurityManager 运行其他线程代码。
编辑:从 Tomcat 或其他服务器中了解他们如何<% System.exit(1); %>
在 JSP 中管理这样的代码。