A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

当多个生产者多个消费者时,会出现一个问题,notify时唤醒的同类的线程。解决办法:notifyAll;
public class ProducerAndConsumer {
    public static void main(String[] args) {
        Resource2 s = new Resource2();
        Producer p = new Producer(s);
        Consumer c = new Consumer(s);
        Producer p1 = new Producer(s);
        Consumer c1 = new Consumer(s);
         new Thread(p).start();
         new Thread(c).start();
         new Thread(p1).start();
         new Thread(c1).start();
    }

}
//定义资源
class Resource2{
   boolean flag =false;
   int count = 0;
   public synchronized void produce(){
        while (!flag) {
            System.out.println("producer:i hava produce" + count++);
            flag = true;
            this.notifyAll();
        }
        try {
            this.wait();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    public  synchronized void consume(){
        while(flag) {
            System.out.println("consumer:i have consume"+count);
            flag = false;
            this.notifyAll();
        }
            try {
                this.wait();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
  //生产者
class Producer implements Runnable{
    private Resource2 s;
    Producer(Resource2 s){
        this.s = s;
    }
    public void run(){
        while (true) {
       s.produce();
        }      
    }   
}
//消费者
class Consumer implements Runnable{
    private Resource2 s;
    Consumer(Resource2 s){
        this.s = s;
    }
    public void run(){
        while(true){
            s.consume();
        }
    }

}

4 个回复

倒序浏览
牛。。。。。。
回复 使用道具 举报
喵喵喵???这是?
回复 使用道具 举报
使用Lock和Condition就好控制了哇
回复 使用道具 举报
不错~~~~~~~~~·
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马