今天早晨,一个朋友发个Java线程问题给我,说是输出结果有问题。问题应该是他昨晚发的,于是我就把他图片里的代码,敲了一遍,运行起来。代码如下(修改版的)
这是典型的生产者与消费者问题,明显应该是先生产者生产一条,然后消费者消费一条,循环而已。但是eclipse竟然运行结果为如下
非常不可思议,为什么会这样呢?代码绝逼没错啊,不可能消费者先输出啊,即便是消费者先输出,他是如何获取name和price的呢?如果把while(true)改成for循环少输出一点,就不会这样了。得出结论:应该是eclipse的控制台显示问题。
后来跟那位朋友讨论了一下,他说是如下图的勾要去掉,最终问题解决了
本文链接:https://liuyanzhao.com/4815.html
- class Product {
- String name;
- double price;
- boolean flag = false;
- }
- //生产者
- class Producer extends Thread {
- Product p;
- public Producer(Product p) {
- this.p = p;
- }
- public void run() {
- int i = 0;
- while(true){
- synchronized (p) {
- while(p.flag) {
- try {
- p.wait();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- if(i%2==0) {
- p.name = "苹果";
- p.price = 6.5;
- } else {
- p.name = "香蕉";
- p.price = 2.0;
- }
- System.out.println("生产者生产了:"+p.name+" 价格是:"+p.price);
- p.flag = true;
- i++;
- p.notifyAll();
- }
- }
- }
- }
- //消费者
- class Customer extends Thread {
- Product p;
- public Customer(Product p) {
- this.p = p;
- }
- public void run() {
- while(true) {
- synchronized (p) {
- while(!p.flag){
- try {
- p.wait();
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- System.out.println("消费者消费了"+p.name+" 价格:"+p.price);
- p.flag = false;
- p.notifyAll();
- }
- }
- }
- }
- public class Demo1 {
- public static void main(String[] args) {
- Product p = new Product();
- Producer producer = new Producer(p);
- Customer customer = new Customer(p);
- producer.start();
- customer.start();
- }
- }
这是典型的生产者与消费者问题,明显应该是先生产者生产一条,然后消费者消费一条,循环而已。但是eclipse竟然运行结果为如下
非常不可思议,为什么会这样呢?代码绝逼没错啊,不可能消费者先输出啊,即便是消费者先输出,他是如何获取name和price的呢?如果把while(true)改成for循环少输出一点,就不会这样了。得出结论:应该是eclipse的控制台显示问题。
后来跟那位朋友讨论了一下,他说是如下图的勾要去掉,最终问题解决了
本文链接:https://liuyanzhao.com/4815.html
您可以选择一种方式赞助本站
支付宝扫一扫赞助
微信钱包扫描赞助
赏