2009-05-14 9 views
2

私はスレッドで割り当てられているので、スレッドがビジー状態になることはありません。 スレッドがブロッキング状態にあるのか、ビジー状態にあるのかをどのように知ることができますか?それをチェックするコマンドはありますか?Javaのビジー待機スレッド

プログラムでは2つの行列があり、それらを変換する必要があります。だから変換スレッドがあり、コードは次のようになります。

transformThread transformThreadFirst = new transformThread(firstMat, n); 
transformThread transformThreadSecond = new transformThread(secondMat, n); 

transformThreadFirst.start(); 
transformThreadSecond.start(); 

try 
{ 
    transformThreadFirst.join(); 
    transformThreadSecond.join(); 
} 
catch(InterruptedException e) 
{ 
} 

スレッドがビジー状態になるか、それとも問題ありませんか?それとももっと良い解決策がありますか? また、transformThreadの実行では、私は歩留まりを使用せず、ループの2つしかありません。変換アクションだけです。

答えて

8

Busy waitingに位置しています。このような何か:

// The next line will be called many many times 
// before the other thread finishes 
while (otherThread.getState() == Thread.State.RUNNABLE) {} 

だからあなたのコードがないビジーウェイトで、現在のスレッドがtransformThreadFirstが終了するまでブロックし、その後transformThreadSecondが完了するまでブロックします。

+0

一般に、私はビジー状態で別のスレッドを待つ恐れがなく、 "join()"コマンドを使用できますか? –

+2

はい、join()は現在のスレッドをブロックします。これは何かが起こるのを待つ正しい方法です。 – soulmerge

+2

@Greg - 私はsoulmergeの説明に合っていますが、join()は正しいアプローチですが、あなたの利益のために、あるスレッドが別のスレッドをビジー状態にすることができないことを認識していれば、それはあなたのOWNスレッドの振る舞いです。フラグをチェックするループのタイプはビジーウェイトですが、ブロックするコマンドはブロックされません。要約すると、誰かがELSEを忙しく待たせることはできません。 –

2

jstackユーティリティがあります。 jstack <pid>とし、実行中のjvmのプロセスIDを渡します。 スレッドステータス(実行中、待機中、ブロック済み)とともに、そのアプリケーション内のすべてのスレッドが何をしているのかを表示します。

それは別の操作が終了するまで繰り返し何かをやっているJDKにバンドルし、そのビン/

+0

これは、私がスリープしていないスレッドをチェックするのに役立ちます。 –