2016-03-18 11 views
0

notify呼び出しを待っているウェイタスレッドが既に待機している場合、別のウェイタスレッドが同期ブロックに入ることはできますか?Javaのスレッドとマルチスレッド

私は他の例でテストしているし、他のすべてのスレッドがスレッドのいずれかが同期ブロックであるときに同期ブロックに入るのを待つように見えるし、新しいスレッドが古いブロックを離れた直後に同期ブロックに入る:

class ThreadClassNotifier implements Runnable { 

private Message msg; 

public ThreadClassNotifier(Message msg) { 
    this.msg = msg; 
} 

@Override 
public void run() { 
    String name = Thread.currentThread().getName(); 
    System.out.println(name+" started"); 
    try { 
     Thread.sleep(1000); 
     synchronized (msg) { 
      msg.setMsg(name+" Notifier work done"); 
      msg.notify(); 
      // msg.notifyAll(); 
     } 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 

} 

} 

class ThreadClassWaiter implements Runnable { 

private Message msg; 

public ThreadClassWaiter(Message m){ 
    this.msg=m; 
} 

@Override 
public void run() { 
    String name = Thread.currentThread().getName(); 
    synchronized (msg) { 
     try{ 
      System.out.println(name+" waiting to get notified at time:"+System.currentTimeMillis()); 
      Thread.sleep(10000); 
      msg.wait(); 
     }catch(InterruptedException e){ 
      e.printStackTrace(); 
     } 
     System.out.println(name+" waiter thread got notified at time:"+System.currentTimeMillis()); 
     //process the message now 
     System.out.println(name+" processed: "+msg.getMsg()); 
    } 
} 

} 

public class ThreadMain { 
    public static void main(String[] args) throws InterruptedException { 
     Message msg = new Message("process it"); 
     ThreadClassWaiter waiter = new ThreadClassWaiter(msg); 
     new Thread(waiter,"waiter").start(); 

     ThreadClassWaiter waiter1 = new ThreadClassWaiter(msg); 
     new Thread(waiter1, "waiter1").start(); 
     System.out.println("All the threads are started"); 

    } 

} 

答えて

2

"どのように別のウェイタースレッドが同期ブロックを入力すると、 ウェイタースレッドがブロックを呼び出すのを待っているブロックで待機していますか?現在のスレッドがこのオブジェクトのモニターを所有している必要がありObject.wait()

用のJavaドキュメントから

スレッドはこのモニタの所有権を解放し、を待機します。別のスレッドが、このオブジェクトのモニタで待機しているスレッドに、notifyメソッドまたはnotifyAllメソッドの呼び出しによって起動することを通知するまで待機します。 スレッドは、モニタの所有権を再度取得できるようになるまで待ち、実行を再開します

関連する問題