2016-05-06 7 views
0
public class ThreadState{ 
    public static void main(String[] args){ 
     Thread one = new Thread(new Runnable(){ 
      @Override 
      public void run(){ 
       System.out.println(Thread.currentThread().getName() + " " + Thread.currentThread().getState()); 
      } 
     }); 
     Thread two = new Thread(new Runnable(){ 
      @Override 
      public void run(){ 
       System.out.println(Thread.currentThread().getName() + " " + Thread.currentThread().getState()); 
      } 
     }); 
     System.out.println(one.getState()); 
     System.out.println(two.getState()); 

     one.start(); 
     two.start(); 

     System.out.println(one.getState()); 
     System.out.println(two.getState()); 
     System.out.println(one.getState()); 
     System.out.println(two.getState()); 

     System.out.println("Main "); 
    } 
} 

私はJavaでThread.Stateを学習しようとしていますが、私はそれらの間で混乱しています。上記のコードを実行すると、私は複数の結果を得ました(私はマルチスレッドのために知っています)。Javaマルチスレッドでのスレッド状態のしくみ

しかし、私はそれらの状態を理解することができません。

1)ここでは、私が学びたいと思っている2つのアウトプットを、どれか一つ説明できますか?

NEW 
NEW 
RUNNABLE 
RUNNABLE 
RUNNABLE 
RUNNABLE 
Thread-0 RUNNABLE 
Thread-1 RUNNABLE 
Main 

これは2番目です。

NEW 
NEW 
RUNNABLE 
BLOCKED 
BLOCKED // 2) Why go to again BLOCKED state? as before it was in RUNNABLE state 
BLOCKED 
Main 
Thread-0 RUNNABLE 
Thread-1 RUNNABLE 

私は既に何がNEW状態であるかについて知っています。何がRUNNABLE状態ですか。しかし、私はブロックと待機状態について混乱しています。

Student object1 = new Student(); // any shared resource 

Thread t1 = new Thread(/*......*/); => NEW State 
Thread t2 = new Thread(/*......*/); => NEW State 

t1.start(); => RUNNABLE STATE 
t2.start(); => RUNNABLE STATE 

`t1` and `t2` trying to get lock on object1 and `t1` successfully got locked on object1. 

3)今t2は、ブロックされた状態または待ち状態になりますか?

`t1` called `wait()` method and released lock. 
`t2` got the lock and `t1` now in WAITING state. 

`t2` called `notify();` and released lock. 
`t1` got the lock 

4)t2は、ブロック状態または待機状態になりますか?

`t1.run();` finished => TERMINATED State 
`t2.run();` finished => TERMINATED State 

5)スレッドが終了しても各スレッドの履歴を保持しますか?そうでなければ、JVMはすでに終了したスレッドのTERMINATED状態をどのように表示しますか?

+0

これはhttp://stackoverflow.com/questions/15680422/difference-between-wait-and-blocked-threadstateを読んでいますか? –

+0

@NicolasFilotto読まない。あなたは2)、5)数字の質問と上記の結果からの出力を説明できますか? –

+0

#2を正確に取得するために何をしましたか?それをループに入れましたか? –

答えて

1

ブロックされていることを意味します。「モニタロックを待ってブロックされたスレッドは、この状態です。」つまり、同期が行われていることを意味します。同期化されたブロックは使用していませんが、スレッドは内部的に行います。 RUNNINGとBLOCKEDが与えられたとすると、プライベートThread.exit()メソッドではおそらく同期が行われています。 Group.threadTerminated()は、たとえば、グループ上で同期されます。

WAITINGは、スレッドがObject.wait()を呼び出したことを意味します。これを行うためには、モニタを所有していなければなりません(オブジェクト待機が呼び出されたことに関連しています)ので、モニタ上でブロックすることはできません。

私は従うならば、答えは3)ブロックされ、4)RUNNINGまたはJVMは、歴史上の保持しているかどうかの

を終了し、私はそれはJVMの要件だかわからない3 & 4のためではなく、あなたがスレッドオブジェクトへの参照を持っている限り、最後の状態が何かを見ることができるはずです。 Threadオブジェクトは単なるObjectとしてのスレッドの表現であることに留意してください。実際のスレッドは、OS /ハードウェア固有です。

+0

と、ポイント5については何ですか? –

+0

平易な推測(確かに分かりません)。しかし、Javaのスレッドインスタンスはまだ存在しますが、実際のスレッドはなくなりました。結果は終了しました。 – n247s

0

1)ここでは、私が学びたいと思っている2つのアウトプットはどれでも説明できますか? 私はすでにNEW状態とは何か、RUNNABLE状態とは何かを知っています。しかし、私はブロックと待機状態について混乱しています。

状態はhereで説明されています。

3)これで、t2はBLOCKED状態またはWAITING状態になりますか?あなたが記述状況で

t2RUNNABLE状態、私見である必要があります。それはロックを解除した。 e。notify()コールを囲むブロック​​を残しました。

4)t2はBLOCKED状態または待機状態になりますか?

私はこれを取得しません。本当に終了すると、すぐに終了状態にする必要があります。

5)JVMはスレッドが終了しても各スレッドの履歴を保持しますか?そうでなければ、JVMはすでに終了したスレッドのTERMINATED状態をどのように表示しますか?

スレッドがなくなっても、スレッドを制御しているオブジェクトは、参照を保持している限り利用できます。そして、このオブジェクトはスレッドが終了したことを伝えます。

0

1)ここでは、私が学びたいと思っている2つのアウトプットはどれでも説明できますか?

&スレッド状態の変化につながるさまざまな条件を理解するために、スレッドstatesの記事を参照してください。

スレッドは、次のいずれかの状態になりますまだ開始されていない

NEW :スレッドがこの状態にあります。

RUNNABLE : Java仮想マシンで実行中のスレッドは、この状態です。

BLOCKED:ブロックされた状態のスレッドが、モニタロックが同期ブロック/メソッドに入るのを待っているか、またはObject.waitを呼び出した後に​​ブロック/メソッドに再び入ります。

WAITING:特定のアクションを実行するために別のスレッドが無期限に待機しているスレッドはこの状態です。

スレッドが原因次のいずれかの方法を呼び出すために待っている状態にあります。

Object.wait with no timeout 
Thread.join with no timeout 
LockSupport.park 

TIMED_WAITING:指定された待機時間までのアクションを実行するために別のスレッドを待っているスレッドが、この中にあります状態。

スレッドが原因指定された正の待機時間で、次のいずれかの方法を呼び出すタイミング待ちの状態になっている:

Thread.sleep 
Object.wait with timeout 
Thread.join with timeout 
LockSupport.parkNanos 
LockSupport.parkUntil 

TERMINATED:終了したスレッドがこの状態にあります。

2)なぜブロック状態になるのですか?以前と同じようにランブル状態にあった

モニタロックを待っているスレッドがブロックされている状態です。クエリ3および4の

スレッド(T1)はロックを解除した場合、他の待機中のスレッド(T2)はRUNNABLE状態へBLOCKED状態から入ります。実行が完了すると、t1スレッドはTERMINATED状態になります。 t2が実行を完了すると、TERMINATEDの状態になります。

5)JVMはスレッドが終了しても各スレッドの履歴を保持しますか?そうでなければ、JVMはすでに終了したスレッドのTERMINATED状態をどのように表示しますか?

プログラムにスレッドの参照が保持されているため、これらのスレッドの状態はTERMINATEDになります。これらの参照を解放すると、JVMにはこれらのスレッドの履歴はありません

関連する問題