2016-03-18 18 views
0

Başka bir garson iş parçacığı, notify numaralı çağrıyı beklerken o blokta bekleyen bir garson iş parçacığı beklediğinde, eşitlenmiş bloğu nasıl girebilir?Java'da Konu Başlıkları ve Çoklu İş Parçacığı

Diğer örnekler ve diğer tüm iş parçacıkları ile test ettik

parçacığı biri senkronize bloğunda ve yeni iplik eskisinin sonra senkronize blok hakkına girdiğinde senkronize blok girmek için beklemek gibi görünüyor blok bırakır:

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"); 

    } 

} 

cevap

2

"Başka bir garson iş parçacığı, zaten numaralı çağrıyı bildirmek için bekleyen bir bekletmeyi bekliyorsa, senkronize bloğu nasıl giriyor?" Object.wait()

geçerli iş parçacığı için java Dokümanlar

bu nesnenin monitörü sahip olmalıdır. İş parçacığı bu monitörün sahipliğini serbest bırakır ve başka bir iş parçacığı, bildirim nesnesine veya notifyAll yöntemine yapılan bir çağrıyla uyanmak üzere bu nesnenin monitöründe bekleyen iş parçacıklarını bildirene kadar bekler. İş parçacığı, monitörün sahipliğini yeniden elde edene kadar bekler ve yürütmeyi sürdürür.

İlgili konular