线程与多个对象同步

问题描述:

我一直在面对这个问题很多天,请帮助我。我正在使用线程同步实现生产者 - 消费者示例。我在这个传统计划中做了一些改变。我只使用了两个队列对象,而不是仅使用一个队列对象。但是,程序无法运行。(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); 
} 

}

我得到了答案。我的误解是等待,通知和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); 
} 

}