Почему JVM не прерывается при использовании RMI - PullRequest
2 голосов
/ 16 января 2010

Я только что прочитал Trail на RMI от солнца в http://java.sun.com/docs/books/tutorial/rmi/implementing.html

Когда я запускаю пример, JVM не завершает работу, хотя main завершил работу. RMI порождает поток где-то внутри?

Каково поведение нескольких потоков, порожденных в main после основных выходов? Это чистый способ позволить потокам выходить, когда они захотят, или вам следует объединяться в каждый созданный вами поток? Я не нашел никакой документации по этому вопросу.

Большое спасибо за вашу помощь !!

public class ComputeEngine implements Compute {

    public ComputeEngine() {
        super();
    }

    public <T> T executeTask(Task<T> t) {
        return t.execute();
    }


    public static void main(String[] args) {
        if (System.getSecurityManager() == null) {
            System.setSecurityManager(new SecurityManager());
        }
        try {
            String name = "Compute";
            Compute engine = new ComputeEngine();
            Compute stub = (Compute) UnicastRemoteObject.exportObject(engine, 0);
            Registry registry = LocateRegistry.getRegistry();
            registry.rebind(name, stub);
            System.out.println("ComputeEngine bound");
        } catch (Exception e) {
            System.err.println("ComputeEngine exception:");
            e.printStackTrace();
        }
    }
}

Ответы [ 4 ]

6 голосов
/ 16 января 2010

Создан поток для прослушивания сокета и ответа на запросы к вашему объекту. Один из способов остановить JVM - отсоединить сервер:

Registry.unbind() 

и неэкспортировать объекты:

UnicastRemoteObject.unexportObject()). 
2 голосов
/ 17 января 2010

Относительно части "поведения нескольких потоков" вашего вопроса: да, JVM продолжит работать, пока все потоки не завершатся. Единственным исключением являются потоки, помеченные как daemon (см. Thread.setDaemon ()), JVM не будет их ждать.

2 голосов
/ 17 января 2010

Вы можете использовать служебную программу jstack , включенную в JDK, чтобы увидеть, какие потоки выполняются в Java-программе и даже на какой строке находятся эти потоки.

Так что, если ваша программа все еще работает, вы просто запустите jstack на pid, и он скажет вам, какие потоки все еще работают и что они делают.

1 голос
/ 16 января 2010

Да, когда вы выставляете объекты через RMI, ему нужен поток, чтобы принимать входящие запросы для этих объектов. Этот поток может быть потоком демона, который не будет препятствовать выходу JVM, но это не по нескольким причинам, и, поскольку все еще существуют активные экспортируемые объекты, он препятствует нормальному выходу JVM. Таким образом, вы можете использовать unsportObject для всех объектов или просто использовать System.exit () для завершения JVM, хотя это может привести к тому, что клиенты не будут информированы о завершении работы.

...