2012-01-20 7 views
5

私はJava Attach APIを使用してローカルJVMに接続しています。私はに接続していVirtualMachineをアタッチとgetSystemPropertiesの呼び出しの間にシャットダウンされた場合getSystemProperties()は永遠にブロックし、そのスレッドでデッドロックが作成され、Windowsマシン上で実行されている以下のjava VirtualMachine.getSystemProperties()デッドロック

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

のようなものをやっています。私はブロックをWindowsVirtualMachine.connectPipe()まで追跡しました。これはネイティブメソッドなので、WindowsVirtualMachine.cのconnectPipe関数にはConnectNamedPipeの呼び出しがあります。私は、Windowsマシン上でConnectNamedPipeデッドロックについていくつかの記事を見てきました。私はブロックされているスレッドを中断しようとしましたが、スレッドをブロック解除しません。

私はかなりの回避策がこれについてはわかりませんが、私は(私は私の現在のソリューションに固執することを好むが)アタッチAPIを使用しないと考えるだろう。私はアタッチAPIを使ってVirtualMachine.list()を使って、ローカルマシン上で動作しているJVMを取得しています。そこから私はそれを使ってシステムプロパティを取得し、JMX経由でそれらに接続します。私はおそらく、ネットワーク上のプロセス間で通信するためにライブラリを使用してカスタムソリューションを作成する可能性があることを知っていますが、むしろ、私はAttach APIが使用していると思われるプロセス間のレベルの通信を使用したいと思います。

私の質問には、問題の回避策がありますか?または私にVirtualMachine.list()と同じ機能を与えるライブラリがありますか?

+0

スレッドの中断はどういう意味ですか?何もしない? – Adrian

+0

ブロックされているスレッドに割り込みを行ってもブロックはブロックされません。 – mikey

+1

また、スレッドを停止()しようとする(これは悪い考えですが、どのように動作するか見てください)。ここに割り込みのためのドキュメントがあります:http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Thread.html#interrupt%28%29 – Adrian

答えて

0

この場合、何が起こりますか?このような問題の一般的な解決策は、スレッドがタスクを完了するのを待つウォッチャースレッドを持つことです。そして、スレッドが終了するまでに一定時間内にデッドロックが発生し、プロセスを終了すると仮定します。明らかに、これはかなり重いですが、あなたがこの場合に行うことができることはそれほどありません。それは「正しい」でしょう。