我的主线程创建了一个新线程
当新线程调用System.exit(-1)
时,我的主线程将被关闭。
如何处理退出代码并使主线程保持活动状态?
PS。
新线程将调用其他.jar
文件中的某个方法,因此我无法对其进行修改。
答案 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);
后者会泄漏线程及其资源,但至少不会杀死你的应用程序。
答案 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); %>
这样的代码。