代码问题。(新开)
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 星