2012-01-19 4 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 스레드를 시작하는 정적 메서드 UnicastRemoteObject.exportObject(this, ...)을 호출합니다.

스레드를 종료하려면 System.exit()을 호출하거나 UnicastRemoteObject.unexportObject(everyObjectThatHasBeenExported)을 사용하여 개체를 unexport 할 수 있습니다. 나중에 JVM을 종료하지 않는 이점이 있습니다.

재시작 가능한 서버/네트워크 서비스를 구축하는 경우 유용합니다. 이 경우 더 이상 사용되지 않는 오래된 객체에 unexportObject을 호출하지 않으면 rmi 스레드가 클러 터됩니다. 또한, rmi 스레드가 여전히 참조를 보유하고 있기 때문에 exportedObject가 가비지 수집으로 제거되지 않는다고 가정합니다.