メインスレッドと子スレッドの2つのスレッドが実行されています。彼らは活動は以下のとおりです。実行が非同期セクションにあるときにスレッドがブロックされた状態になる理由
- 子スレッドは100に1つの
- メインスレッドの合計をカウントし、それが子供で計算されます一度(私は
wait
とnotify
を使用)、総合計を出力します。また、子スレッドのステータスを出力します。
以下はコード部分です。
class MainThread {
public static void main(String[] args) throws InterruptedException {
ThreadB b = new ThreadB();
b.setName("Child thread: ");
b.start();
synchronized(b) {
System.out.print("\nwaiting for b to complete\n");
b.wait();
System.out.print("\nno more wait .........................\n");
for (int i = 0; i < 1000; i++)
System.out.print("\n" + b.getName() + "'s state:" + b.getState());
}
Thread.sleep(1000);
System.out.print("\n" + b.getName() + "state:" + b.getState());
System.out.print("\ntotal in " + Thread.currentThread().getName() + "is :" + b.total);
}
}
class ThreadB extends Thread {
int total;
public void run() {
synchronized(this) {
for (int i = 0; i < 100; i++)
total += i;
System.out.println(this.getName() + "finished sum, lets notify other objects");
notify();
System.out.println(this.getName() + " done with notify and sync block\n");
}
System.out.println(this.getName() + " : entered non critical section");
for(int j = 0; j < 1000; j++) {
System.out.print("Hi ");
}
}
}
- 子は、その同期ブロックを終了し、メインスレッドに通知しました。それでも、ループ内に
"Hi "
という文字を印刷するだけの非同期部分が開始されています。 - 通知後メインスレッドが作業を再開し、子のステータスを表示します。
しかし、ここでは私の観察である:実行中"Hi "
(非シンクブロックにあるforループ)、時には子供のステータスがRUNNABLE
、それはBLOCKED
だ倍の大半です。たとえば、次のようにその非同期ブロックを実行するときに、子スレッドがBLOCKED
状態で進入させ何
Child thread: 's state:RUNNABLE Hi Hi Hi
Child thread: 's state:BLOCKED Hi Hi Hi Hi
?
これは間違いありません。 b.wait()は待機中にモニターをあきらめています。したがって、デッドロックは発生しません。 – rpy