2012-01-19 13 views
1

こんにちは私はリモートオブジェクトであるクラスを持っており、メソッドを実装しました。 それから、私は地元でテストしたかっただけです。だから私はそれにメインの方法を追加しました。 それから主に、私はノートパッドを実行するruntUtilAppメソッドを呼び出しました。いくつかのスリープの後、私はメモ帳の作業を終了し、私はstopメソッドを呼び出しました。すべての実行の後、実行を終了するためにプログラムを待ちます。しかしそれはまだ働いており、終わらない。Rmi、プログラムは終了していませんか?

この理由は何ですか? 私は間違っていると思いますか?


import java.io.IOException; 
import java.rmi.RemoteException; 
import java.rmi.server.*; 



public class ClientImp extends UnicastRemoteObject implements Remote{ 

    private static final long serialVersionUID = 227L; 
    private Process proc; 

/** 
* constructor 
*/ 
public ClientImp() throws RemoteException { 
    super(); 
} 


public boolean runApp() throws RemoteException { 
    try { 
     Runtime rt = Runtime.getRuntime(); 
     proc = rt.exec("notepad"); 
     return true; 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     return false; 
    } 
} 


public boolean stopCurrentUtilApp() throws RemoteException { 
    proc.destroy(); 
    return true; 
} 

public static void main(String[] args) { 
    client; 
    try { 
     ClientImp client = new ClientImp(); 
     client.runUtilApp(); 
     Thread.sleep(10000); 
     client.stopCurrentUtilApp(); 
    } catch (RemoteException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

}

答えて

2

クラスがRMIサーバオブジェクトとしてこのオブジェクトをエクスポートしている、あなたは、クラスの新しいインスタンスを作成するときに、UnicastRemoteObjectコンストラクタが呼び出されることを意味し、UnicastRemoteObjectを拡張しているので、デーモンではないRMIスレッドが起動します。

System.exit()を呼び出してJVMを終了します。

2

(それは私が/はすでに与えられた答えを拡張完了したい、他の多くのRMI関連の質問で参照されているように私はこれは古い質問ですけど、)

すでに述べたように、JVMが出ていないとして、非デーモンのRMIスレッドがまだ実行中であるためです。このスレッドは、UnicastRemoteObjectのコンストラクタが実行されたときに実行を開始しました。

このコンストラクタ自体は、RMIスレッドを開始するstaticメソッドUnicastRemoteObject.exportObject(this, ...)を呼び出します。

スレッドを終了するには、System.exit()を呼び出すか、UnicastRemoteObject.unexportObject(everyObjectThatHasBeenExported)を使用してオブジェクトをアンエクスポートすることができます。後者は、JVMを解体しないという利点があります。

これは、再起動可能なサーバー/ネットワークサービスを構築する場合に便利です。 この場合、古い(もう使用されていない)オブジェクトでunexportObjectを呼び出さないと、rmiスレッドがクラッタします。さらに、rmiスレッドは依然として参照を保持しているため、exportedObjectはガベージコレクションによって削除されないと想定しています。

関連する問題