首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java ()不会停止Runtime#halt

Java ()不会停止Runtime#halt
EN

Stack Overflow用户
提问于 2012-12-27 01:39:45
回答 2查看 2.5K关注 0票数 2

这是一个使用RMI的客户端/服务器应用程序。服务器收到destroy()的RMI请求后,我需要中止VM。为此,我使用了Runtime.getRuntime().halt(0)。但是在调用halt()之后,VM仍然存在,我可以终止它的唯一方法就是在OSX上使用Force Kill

调用线程的堆栈跟踪如下:

代码语言:javascript
复制
"RMI TCP Connection(3)-192.168.1.4" daemon prio=5 tid=7f99a7103000 nid=0x11d467000 runnable [11d464000]
   java.lang.Thread.State: RUNNABLE
    at java.lang.Shutdown.halt0(Native Method)
    at java.lang.Shutdown.halt(Shutdown.java:95)
    - locked <7f44c90d0> (a java.lang.Shutdown$Lock)
    at java.lang.Runtime.halt(Runtime.java:256)
    at net.sourceforge.marathon.runtime.JavaRuntime.destroy(JavaRuntime.java:178)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at net.sourceforge.rmilite.impl.RemoteInvocationHandlerImpl.invoke(RemoteInvocationHandlerImpl.java:70)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:303)
    at sun.rmi.transport.Transport$1.run(Transport.java:159)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.Transport.serviceCall(Transport.java:155)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:790)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:649)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:680)

可能的问题是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-27 15:34:25

我尝试了多种方法来让它工作。

在调用SwingUtilities.invokeLater中的halt().

  • Invoked halt()中的SwingUtilities.invokeAndWait

  • Invoked Runtime#runFinalization之前,halt()添加了Runtime#runFinalization

这些都不管用。最后,

  1. 使用Timer#schedule

在计时器任务中调用halt()

这是有效的,并且一直有效到现在。感谢大家的回复。

票数 2
EN

Stack Overflow用户

发布于 2015-09-03 18:17:04

当您收到销毁()命令时,您应该:

取消导出所有远程对象和注册表对所有远程对象和注册表的任何静态引用。

然后,JVM将自动退出,除非您正在执行任何非守护进程线程。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14044061

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档