0

我一直在面對這個問題很多天,請幫助我。我正在使用線程同步實現生產者 - 消費者示例。我在這個傳統計劃中做了一些改變。我只使用了兩個隊列對象,而不是僅使用一個隊列對象。但是,程序無法運行。(PS-我知道我可以只使用一個隊列的對象使這個方案的工作,但如果我想用兩個隊列中的哪些對象?)線程與多個對象同步

級隊列{

static int value; 

static boolean valueSet = false; 

public static final Object obj; 

static { 

    obj = new Object(); 
} 


void push() { 

    synchronized(Queue.obj) { 

     while(Queue.valueSet) { 

      try { 
      Thread.sleep(1000); 
      }catch(Exception e) {} 
     } 

     System.out.print("\n\n Push:- " + (++(Queue.value))); 
     Queue.valueSet = true; 

     return; 

    } 

} 

void pop() { 

    synchronized(Queue.obj) { 

     while(!(Queue.valueSet)) { 

      try { 
      Thread.sleep(1000); 
      }catch(Exception e) {} 
     } 

     System.out.print("\n\n Pop:- " + Queue.value); 

     Queue.valueSet = false; 

     return; 

    } 

} 

}

類生產者實現Runnable {

Queue Q; 
Thread P; 


Producer(Queue Q) { 

    this.Q = Q; 
    P = new Thread(this); 
    P.start(); 

} 

public void run() { 

    while(true) { 

     Q.push(); 

    } 
} 

}

消費類實現Runnable {

Queue Q; 
Thread C; 

Consumer(Queue Q) { 

    this.Q = Q; 
    C = new Thread(this); 
    C.start(); 


} 

public void run() { 

    while(true) { 

     Q.pop(); 

    } 
} 

}

公共類TestQueue {

public static void main(String[] args) { 

    Queue Q1 = new Queue(); 
    Queue Q2 = new Queue(); 

    Object obj = new Object(); 


    Producer p = new Producer(Q1); 
    Consumer c = new Consumer(Q2); 
} 

}

回答

0

我得到了答案。我的誤解是等待,通知和notifyall方法是線程類。所以我在線程對象上調用它們。

解決方法是隻對線程以外的共享靜態對象調用wait和notify方法。

答: -

級隊列{

static int value; 

static boolean valueSet = false; 

public static final Object obj; 

static { 

    obj = new Object(); 
} 


void push() { 

    synchronized(Queue.obj) { 

     while(Queue.valueSet) { 

      try { 
      Queue.obj.wait(); 
      Thread.sleep(1000); 
      }catch(Exception e) { 

       e.printStackTrace(); 
      } 
     } 

     System.out.print("\n\n Push:- " + (++(Queue.value))); 
     Queue.valueSet = true; 
     Queue.obj.notify(); 
    } 

} 

void pop() { 

    synchronized(Queue.obj) { 

     while(!(Queue.valueSet)) { 

      try { 
      Queue.obj.wait(); 
       Thread.sleep(1000); 
      }catch(Exception e) { 

       e.printStackTrace(); 
      } 
     } 

     System.out.print("\n\n Pop:- " + Queue.value); 

     Queue.valueSet = false; 
     Queue.obj.notify(); 
    } 

} 

}

類生產者實現Runnable {

Queue Q; 
Thread P; 


Producer(Queue Q) { 

    this.Q = Q; 
    P = new Thread(this); 
    P.start(); 

} 

public void run() { 

    while(true) { 

     Q.push(); 

    } 
} 

}

階層的消費工具Runnable接口{

Queue Q; 
Thread C; 

Consumer(Queue Q) { 

    this.Q = Q; 
    C = new Thread(this); 
    C.start(); 


} 

public void run() { 

    while(true) { 

     Q.pop(); 

    } 
} 

}

公共類TestQueue {

public static void main(String[] args) { 

    Queue Q1 = new Queue(); 
    Queue Q2 = new Queue(); 

    Producer p = new Producer(Q1); 
    Consumer c = new Consumer(Q2); 
} 

}