2017-02-06 5 views
0

では、私は単純なコード片を怒鳴るを持っている:スレッド:()を通知し、(待つ)javaの

public class ThreadA { 
public static void main(String[] args){ 
    ThreadB b = new ThreadB(); 
    b.start(); 

    synchronized(b){ 
     try{ 
      System.out.println("Waiting for b to complete..."); 
      b.wait(); 
     }catch(InterruptedException e){ 
      e.printStackTrace(); 
     } 

     System.out.println("Total is: " + b.total); 
    } 
} 



class ThreadB extends Thread{ 
    int total; 
    @Override 
    public void run(){ 
     synchronized(this){ 
      for(int i=0; i<100 ; i++){ 
       total += i; 
      } 
      notify(); 
     } 
    } 
} 

結果:

Waiting for b to complete... 
Total is: 4950 

と私たちは、このコードを使用する必要がある理由問題があり、私はここにはっきりとはいない。

synchronized(this){ 
     for(int i=0; i<100 ; i++){ 
      total += i; 
     } 
     notify(); 
    } 

ここで同期を使用しないと、同じ結果が得られます。

+0

同期されていないと、おそらく動作しない可能性があります。あなたはスレッドスケジューラの恩恵を受けています。 – Henry

+0

何を待つ**と**通知する**あなたの質問ですか? –

+0

[Javaで待機して通知する方法]の複製がありますか?(http://stackoverflow.com/questions/886722/how-to-use-wait-and-notify-in-java) – rkosegi

答えて

1

notify()が呼び出されwait()に対応することを認識した場合、「事前発生」関係が確立されています。前notify()ThreadBに起こったことすべてはwait()リターンを対応後ThreadAに表示されます。したがって、あなたのケースでは、totalのすべての変更がnotify()より前に完了しており、ThreadAにこれらの変更が反映されると見なすことは安全です。

ただし、同期にはwait()/notify()を使用するのは間違っていることに注意してください。偽の起床(すなわち、対応するnotify()なしで起床するwait())があります。これらのメソッドを使用するための特定の慣用的な方法があります(実際にはPOSIXの偽装された条件変数です)。そのうちの一つは、スレッドがthis.notifyAll()を呼び出す終了するとhere

0

を参照して、両方のスレッド(例えば「is_completed変数がtrueである)から確認することができ、「条件」を定義し、ループ内でwait()を呼び出すようにするので、あなたの呼び出しですThreadBnotify()は厳密には必要ではない

しかし、Thread.join()ノートのドキュメントとして、Threadオブジェクト上のモニター操作の使用はお勧めしません:。

番目として読み取りが終了するとthis.notifyAllメソッドが呼び出されます。アプリケーションではwait,notifyまたはnotifyAllThreadインスタンスに使用しないことをお勧めします。あなたが完了するのを待つThreadBしたい場合は

、ちょうどThreadAからb.join()を呼び出します。同期ブロックは一切必要ありません。

public class ThreadA { 
    public static void main(String[] args) throws InterruptedException { 
     ThreadB b = new ThreadB(); 
     b.start(); 
     System.out.println("Waiting for b to complete..."); 
     b.join(); 
     System.out.println("Total is: " + b.total); 
    } 
} 

public class ThreadB extends Thread { 
    int total; 

    @Override 
    public void run() { 
     for (int i = 0; i < 100; i++) { 
      total += i; 
     } 
    } 
} 
関連する問題