2016-07-17 9 views
1

私はJavaでwait notifyメソッドを簡略化する人が必要です。 私はおそらく200以上のサイトを見てきましたが、まだ理解していません。同期待ちキーワードを使用してJavaで通知する方法

私は待ち時間が第一のRunnableで発生する必要があり、あなたが持っている必要があり

class mainClass{ 
public static void main(String args[])throws Exception{ 
     Thread t1 = new Thread(new Runnable(){ 
      public void run(){ 
      //code inside to make thread t1 wait untill some other thread 
      //calls notify on thread t1? 
      } 
     }); 
     t1.start(); 


     synchronized(t1){ 
      //main thread calling wait on thread t1? 
      t1.wait(); 
     } 



     new Thread(new Runnable(){ 
      public void run(){ 
       try{ 
        synchronized(t1){ 
          t1.notify() //????? 
        } 
       }catch(Exception e1){} 
      } 
     }).start(); 
} 
} 
+1

基本的なリソースは、[Object.wait](https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#wait--)、[スレッド。 (https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html#join-long-)を参照してください。 – VGR

+0

友人に感謝します。 – EchoCode

答えて

1

...通知が別のスレッドから呼び出されるまで待機しているべき1つのスレッドを持っている必要がプログラムに取り組んでいます待機するObjectインスタンスへのアクセスは、t1 Threadインスタンスは機能しません。このコードでは、別のロックオブジェクトを作成しました。

public static void main(String[] args) { 
    final Object lock = new Object(); 
    new Thread(new Runnable() { 
     @Override 
     public void run() { 
      synchronized(lock) { 
       try { 
        lock.wait(); 
        System.out.println("lock released"); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    }).start(); 
    System.out.println("before sleep"); 
    try { 
     Thread.sleep(1000); 
     System.out.println("before notify"); 
     synchronized(lock) { 
      lock.notify(); 
     } 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
} 

スレッド通知を使用すると、テストするのが非常に難しい場合があります。 Akkaのようなメッセージベースのアプローチを使用することをおすすめします。

関連する問題