2

これは、RMIを使用するクライアント/サーバーアプリケーションです。サーバーがdestroy()のRMI要求を受信したら、VMを中止する必要があります。私はRuntime.getRuntime().halt(0)この目的のために使用しています。しかし、halt()を呼び出した後も、VMはまだ存在しており、それを強制終了する唯一の方法はForce Kill、OSXで使用することです。

呼び出し元のスレッドのスタックトレースは次のとおりです。

"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)

何が問題なのですか?

4

2 に答える 2

2

私はこれを機能させるために複数のことを試みました。

  1. Runtime#runFinalizationhalt()の呼び出しの前に追加されました。
  2. で呼び出さhalt()れますSwingUtilities.invokeAndWait
  3. で呼び出さhalt()れますSwingUtilities.invokeLater

これらはどれも機能しませんでした。ついに、

  1. halt()を使用してタイマータスクで呼び出されますTimer#schedule

これは機能し、現在まで一貫して機能しています。返信してくれた皆さんに感謝します。

于 2012-12-27T07:34:24.570 に答える
0

destroy()コマンドを受け取ったら、次のことを行う必要があります。

  1. すべてのリモートオブジェクトのエクスポートを解除します。
  2. レジストリのエクスポートを解除します。
  3. リモートオブジェクトおよびレジストリへの静的参照をすべてクリアします。

デーモン以外のスレッドを実行していない限り、JVMは自動的に終了します。

于 2015-09-03T10:17:04.393 に答える