以下是毕老师视频里面讲到的生产者与消费者程序里面类Resource的代码:- package thread2;
- public class Resource {
- private String name;
- private int count = 1;
- private boolean flag = false;
- public synchronized void set(String name) {
- while(flag)
- try {
- this.wait();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- this.name = name + "--" + count++;
- System.out.println(Thread.currentThread().getName() + "...生产者..."
- + this.name);
- flag=true;
- this.notifyAll();
- }
- public synchronized void out() {
- while(!flag)
- try {
- this.wait();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- System.out.println(Thread.currentThread().getName() + "...消费者..."
- + this.name);
- flag=false;
- this.notifyAll();
- }
- }
复制代码 这段代码里面中循环判断标记这一块我有疑问,毕老师视频里是说:
假设当t1获得CPU执行权的时候,t1判断标记为假,它不需要等待,它就往里面赋了一个值,然后count++一次,再打印
如果它赋的值是130,那么假设它打印的是Thread-0...生产者...+商品+--130(当然,有可能也会是Thread-1...生产者...+商品+--130),
即表示生产了一次,生产完以后,就把标记置为真了,然后执行notify,notify完以后,它这时是还有执行权的,
然后去再次判断,一看flag为true,它于是就等着,这时t2,t3,t4都有可能抢到CPU执行权,假设t2抢到了,它于是去判断标记,
一看为真,于是它也就等着了,这时只剩下t3和t4了,t3一进来判断标记!flag为假,不需要等,即消费了一次,到目前为止,这属于正常消费,
即生产一次,消费一次,消费完了以后,它就把标记置为false了。
这里t3抢到执行权以后,当它判断标记的时候,应该是!flag为真才对啊,因为只有仓库里面有商品的时候,它才能消费吧?
|
|