Java 多线程间通信 多生产 多消费问题

来源:互联网 发布:餐厅网络推广方案 编辑:程序博客网 时间:2024/05/16 12:21
/*生产者,消费者多生产者,多消费者的问题if判断标记 只有一次 会导致不该运行的线程运行了,出现了数据错误的情况while判断标记 解决了线程获取执行权后,是否要允许!notifyAll解决了 本方线程一定会唤醒对方线程(但是影响效率)notify 只能唤醒一个线程,如果本方唤醒了本方没有意义 而且while判断标记+ notify会导致死锁*/class Producer implements Runnable{private Resource r;Producer(Resource r){this.r=r;}public void run(){while(true){r.set("烤鸭");}}}class Consumer implements Runnable{private Resource r;Consumer(Resource r){this.r=r;}public void run(){while(true){r.out();}}}class Resource{private String name;private int count=1;private boolean flag=false;public synchronized  void set(String name){while(flag){try{wait();} catch(InterruptedException e){}}this.name=name+count;count++;System.out.println(Thread.currentThread().getName()+"..生产者.."+this.name);flag=true;notify();}public synchronized void out(){while(!flag){try{wait();} catch(InterruptedException e){}}System.out.println(Thread.currentThread().getName()+"..--消费者----.."+this.name);flag=false;notify();} }class ProducerConsumerDemo{public static void main(String[] args) {Resource r=new Resource();Producer pro=new Producer(r);Consumer con=new Consumer(r); Thread t0=new Thread(pro);Thread t1=new Thread(pro);Thread t2=new Thread(con);Thread t3=new Thread(con);t0.start();t1.start();t2.start();t3.start();}}