毕老师在生产者消费者模式的版本一中,有两个线程来进行生产,两个对象负责消费。由于使用notify()方法唤醒了同一类的线程(同时负责消费或者生成的线程),所以造成了生产两次消费一次的情况。我在wait()之后加了else,原本在wait()后醒来继续向下执行,加过else后就要重新判断了,和老师的效果是一样的吧?- class Res
- {
- private String name;
- private int count=1;
- private boolean flag=false;
-
- public synchronized void set(String name)
- {
- if(flag)
- {
- try
- {
- this.wait();
- }
- catch(Exception e){}
- }
- else
- {
- this.name=name+"----"+count++;
- System.out.println(Thread.currentThread().getName()+"...生产者..."+this.name);
- flag=true;
- notifyAll();
- }
- }
-
- public synchronized void out()
- {
- if(!flag)
- {
- try
- {
- this.wait();
- }
- catch(Exception e){}
- }
- else
- {
- System.out.println(Thread.currentThread().getName()+"...消费者........"+this.name);
- flag=false;
- notifyAll(); }
- }
- }
复制代码 不过由于本程序是在调用的时候使用了循环,如果调用没循环的话if else只执行一次,是不是多线程就没有意义了?
看到后面,新版本里面有了lock和condition好用多了
|