代码问题。(新开)
Queue
public class Queue { private int n; boolean flag = false; // 判断有没有商品,默认没有商品,要先生产 // 消费 public synchronized int getN() { /* * if (flag ==false) { try { wait(); } catch (InterruptedException e) { // TODO * Auto-generated catch block e.printStackTrace(); } } */ if (flag == true) { System.out.println("消费:" + n); flag = false; } // notifyAll(); return n; } // 生产 public synchronized void setN(int n) { /* * if (flag == true) { try { wait(); } catch (InterruptedException e) { // TODO * Auto-generated catch block e.printStackTrace(); } } */ if (flag == false) { System.out.println("生产:" + n); this.n = n; flag = true; // notifyAll(); } } }
Producer
public class Producer implements Runnable { Queue queue; public Producer(Queue queue) { this.queue=queue; } @Override public void run() { int i=0; while(true) { queue.setN(i++); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
Consumer
public class Consumer implements Runnable { Queue queue; public Consumer(Queue queue) { this.queue=queue; } @Override public void run() { while(true) { queue.getN(); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
Test
public class Test { public static void main(String[] args) { Queue queue=new Queue(); new Thread(new Producer(queue)).start(); new Thread(new Consumer(queue)).start(); } }
为什么会出现这种情况呢??
17
收起
正在回答
1回答
同学你好,因为同学将线程等待以及线程唤醒的代码都注释掉了,如下图:
所以线程在执行时此线程不会进入等待。
下图是为了测试而写。我们将生产者沉睡时间调整到200ms并打印i的值发现,我们在运行消费者线程时,生产者不会锁死还会继续运行,所以代码会出现打印n的值衔接不上的情况。
注:调整沉睡时间的原因是为了让效果更明显。之前sleep沉睡时间一样,但是由于电脑性能等原因,生产者方法先沉睡,先唤醒,因为同学将wait代码注释,所以会导致没有被wait方法终止,run方法很可能先抢占资源,就会再执行一次,导致i的值多加了一次,最后出现同学运行的效果。
如果我的回答解决了你的疑惑,请采纳,祝学习愉快~
1. Java 零基础入门
- 参与学习 人
- 提交作业 3802 份
- 解答问题 11489 个
本阶段带你迈入Java世界,学习Java必备基础知识,基础语法、面向对象思想以及常用工具类的使用。
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星