题目是 :一个生产者 一个消费者 生产者生产一个 消费者 拿走一个
package com.Thread;public class Demo_Text {
public static void main(String[] args) {
Buffers b = new Buffers();

new Thread(new Producter(b)).start();
new Thread(new Consumerss(b)).start();
}}class Producter implements Runnable{
Buffers b =null ;

public Producter(Buffers b){this.b = b;}

public void run() {

int i = 0 ;
while(true){
if(i==0) b.set("zShang", "male");
else b.set("lSi", "female");

i=(i+1)%2;
}
}

}class Consumerss implements Runnable{
Buffers b =null ;

public Consumerss(Buffers b){this.b = b;}

public void run() {
while (true) {
b.get();

}
}
}class Buffers{
private String name = "Unknown";
private String sex = "Unknown" ;
private boolean isFull = false;

public boolean set_ed = false;
public boolean get_ed = false;

public synchronized void set(String name ,String sex){
if(isFull)try{wait();}catch(Exception e){}
this.name = name ;
try{Thread.sleep(10);}catch(Exception e){}
this.sex = sex ;
isFull = true;
notify();
}

public synchronized void get(){
if(!isFull)try{wait();}catch(Exception e){}
System.out.print(this.name+":");
try{Thread.sleep(10);}catch(Exception e){}
System.out.println(this.sex);
isFull = false;
notify();
}
}  代码是一个生产者和一个消费者  
    若是2 个生产者 和 2 个消费者 我要生产者1 生产后只准消费者1 拿走 然后在是生产者2 生产 也只准消费者2 拿走
      在生产者1 .... 这样的执行 怎么思路??      

解决方案 »

  1.   

    我的想法是 生产者1 生产完后 把自己给wait() 把生产者2 notify()
               消费者1 拿走后把自己wait()  把消费者2notify()
              
               生产者2 生产完后 把自己给wait() 把生产者1 notify()
               消费者2 拿走后把自己wait()  把消费者1notify()           在生产者1 和生产者2各自的构造方法里传buffer 和 对应的生产者对象            在消费者1 和消费者2各自的构造方法里传buffer 和 对应的消费者对象           在其中一个生产者和其中一个消费者 做个单例 好调用....
         不知道行不行 .  多线程没学习. 自己的想法. 谢谢大家的解答
      

  2.   

    不知道你为什么要这要做,但是给你个思路吧,给馒头对象增加一个属性productId,每生产一个馒头都为这个属性赋值说明是哪个生产者生产的馒头,然后每当消费者被唤醒去吃馒头时都去判断如果不符合你的条件,让他继续睡眠,直到唤醒的是你想要的那个消费者是再继续执行代码.
      

  3.   

     这个想法是我看视频自己想的 
        是不是这样: 
           把生产者的productId 初始都为0 ;
           我把生产者1 生产的产品编号 让它的productId没生产一次就++ 
             把生产者2 生产的产品编号 让它的productId没生产一次就--
           
           消费者吃的时候判断生产者的productId 
              productId > 0 消费者1 拿走
              productId < 0 消费者2 拿走     但是在确定productId 之后 让另一个消费者 等待
           在生产一个productId  后让另一个生产者等待
      

  4.   

    搞的很麻烦的样子  
    设置下面几个同步对象object1   object2  object3 object 4  生产者一生产过后  在 object1上 notify   消费者1 在 object1上 wait   消费者1消费完毕后 在object2 上notify    生产者2在object2上wait生产者2生产后在 object3上notify  消费者2在object3上wait消费者2消费完毕后在 object4上 notify 生产者1则在object4上 wait
    可以控制让 生产者1先执行   这样就可以 控制流程按照你的顺序执行 
      

  5.   

    那用两个buffer, 1那一组synchronized buffer1,2那一组synchronized buffer2
      

  6.   


    不是什么加加减减的,那还不乱套了,new Thread().currentThread().getId()这个方法可以获取到当前线程的id,将这个值赋给productId不就完了么.这里的new Thread()写你的线程对象名.
      

  7.   


    +1  使用notify()和wait()方法,此外注意使用这两个方法时需要获得对象的锁,也就是要再synchronized方法中或synchronized块中使用