2012-01-20 11 views
5

Używam interfejsu Java Attach API do łączenia się z lokalnymi maszynami JVM. robię coś jak na poniższymZakleszczenie java VirtualMachine.getSystemProperties()

VirtualMachine vm = VirtualMachine.attach("8400"); 
Properties props = vm.getSystemProperties(); 

uruchomiony na komputerze z systemem Windows, jeśli maszyna wirtualna Łączę się to zamknięcie pomiędzy dołączyć i rozmowy getSystemProperties, getSystemProperties() zablokuje na zawsze i stworzyć impasu w tym wątku. Wykreśliłem blok w dół do WindowsVirtualMachine.connectPipe(). jest to metoda natywna, więc w funkcji connectPamed WindowsVirtualMachine.c istnieje wywołanie ConnectNamedPipe. widziałem kilka postów dotyczących zakleszczeń ConnectNamedPipe na komputerach z systemem Windows. Próbowałem przerwać wątek, który jest zablokowany, ale to nie odblokuje wątku.

Nie jestem do końca pewien, na czym polega obejście tego problemu, ale uważam, że nie korzystam z interfejsu API Attach (chociaż wolę trzymać się mojego obecnego rozwiązania). używam Attach API do użycia VirtualMachine.list(), aby uruchomić JVM na komputerze lokalnym. a następnie stamtąd używam tego, aby uzyskać właściwości systemowe i połączyć się z nimi poprzez JMX. Wiem, że prawdopodobnie mógłbym stworzyć niestandardowe rozwiązanie przy użyciu biblioteki do komunikacji między procesami w sieci, ale wolałbym używać komunikacji na poziomie os poziomu między procesami, co jest moim zdaniem interfejsem API Attach.

więc moje pytanie jest tam jakieś obejścia dla mojego problemu? lub są jakieś biblioteki, które mogłyby dać mi taką samą funkcjonalność jak VirtualMachine.list()?

+0

Co oznacza przerwanie wątku nie działa? nic nie robi? – Adrian

+0

przerwanie wątku, który jest zablokowany, nie powoduje jego odblokowania. – mikey

+1

Spróbuj także zatrzymać() wątek (który BTW jest złym pomysłem, ale zobacz, jak się zachowuje). Oto dokument przerwać: http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Thread.html#interrupt%28%29 – Adrian

Odpowiedz

0

co chciałbyś zrobić w tym przypadku? Typowym rozwiązaniem problemu takiego jak ten jest posiadanie wątku obserwatora, który czeka na zakończenie zadania przez wątek, a następnie, jeśli nie zakończy go w pewnym momencie, zakłada zakleszczenie i wyjście z procesu. Oczywiście jest to dość ciężkie rozdanie, ale w tym przypadku nie można wiele zrobić, co byłoby "poprawne".

Powiązane problemy