2012-01-20 14 views
5

Yerel JVM'lere bağlanmak için Java Attach API'sini kullanıyorum. i sanal makine eğer ben bağlanırken ediyorum, bir windows makinede çalışan aşağıdakijava VirtualMachine.getSystemProperties() deadlock

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

gibi bir şey yapıyorum arasındaki kapatma takmak ve getSystemProperties görüşmeleri, getSystemProperties() sonsuza engellemek ve bu iş parçacığı bir kilitlenme yaratacaktır. bloğu WindowsVirtualMachine.connectPipe()'a kadar takip ettim. Bu yerel bir yöntem, WindowsVirtualMachine.c connectPipe işlevinde ConnectNamedPipe çağrısı var. Windows makinelerde ConnectNamedPipe deadlocking hakkında birkaç mesaj gördüm. Engellenen iş parçacığını kesmeyi denedim, ancak iş parçacığı engellemedi.

Bunun için geçici çözümün ne olduğundan emin değilim, ancak Attach API'sini kullanmayı düşünmüyorum (mevcut çözümümde kalmamayı tercih etsem de). Yerel makinede çalışan JVM'leri almak için VirtualMachine.list()'u kullanmak için Attach API'sini kullanıyorum. ve sonra oradan sistem özelliklerini almak ve JMX üzerinden onlara bağlanmak için kullanıyorum. Ağ üzerindeki süreçler arasında iletişim kurmak için bir kütüphane kullanarak özel bir çözüm oluşturabileceğimi biliyorum, ancak Eklenti API'sinin kullandığına inandığım süreçler arasında os düzeyindeki iletişimi kullanmayı tercih ediyorum.

Bu yüzden sorum benim sorunum için herhangi bir geçici çözüm var mı? veya bana VirtualMachine.list() ile aynı işlevselliği veren herhangi bir kütüphane var mı?

+0

Ne iş parçacığı kesintiye uğraşmak anlamına gelmiyor? hiçbir şey yapmıyor mu? – Adrian

+0

engellenen iş parçacığını kesmek, engellemeyi kaldırmaz. – mikey

+1

Ayrıca, iş parçacığı() BTW'nin kötü bir fikir olduğunu, ancak nasıl davrandığını görmeyi durdurmayı deneyin. İşte interrupt için: http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Thread.html#interrupt%28%29 – Adrian

cevap

0

Bu durumda ne olmak istersiniz? Bunun gibi bir problem için ortak bir çözüm, iş parçacığının bir işi bitirmesini bekleyen bir izleyici iş parçacığına sahip olmaktır ve eğer bir süre sonra bitirmezse, bir çıkmazın olduğunu ve işlemden çıktığını varsayar. Açıkçası bu oldukça ağır bir iştir, ancak bu durumda yapabileceğiniz başka bir şey yoktur, 'doğru' olacaktır.