eclipse的控制台显示有问题,关闭Limit console output

avatar 2017年07月01日09:19:52 1 3230 views
博主分享免费Java教学视频,B站账号:Java刘哥 ,长期提供技术问题解决、项目定制:本站商品点此
今天早晨,一个朋友发个Java线程问题给我,说是输出结果有问题。问题应该是他昨晚发的,于是我就把他图片里的代码,敲了一遍,运行起来。代码如下(修改版的)
  1. class Product {
  2.     String name;
  3.     double price;
  4.     boolean flag = false;
  5. }
  6. //生产者 
  7. class Producer extends Thread {
  8.     Product p;
  9.     public Producer(Product p) {
  10.         this.p = p;
  11.     }
  12.     public void run() {
  13.         int i = 0;
  14.         while(true){
  15.             synchronized (p) {
  16.                 while(p.flag) {
  17.                     try {
  18.                         p.wait();
  19.                     } catch (InterruptedException e) {
  20.                         e.printStackTrace();
  21.                     }
  22.                 }
  23.                 if(i%2==0) {
  24.                     p.name = "苹果";
  25.                     p.price = 6.5;
  26.                 } else {
  27.                     p.name = "香蕉";
  28.                     p.price = 2.0;
  29.                 }
  30.                 System.out.println("生产者生产了:"+p.name+" 价格是:"+p.price);
  31.                 p.flag = true;
  32.                 i++;
  33.                 p.notifyAll();
  34.             }
  35.         }
  36.     }
  37. }
  38. //消费者
  39. class Customer extends Thread {
  40.     Product p;
  41.     public Customer(Product p) {
  42.         this.p = p;
  43.     }
  44.     public void run() {
  45.         while(true) {
  46.             synchronized (p) {
  47.                 while(!p.flag){
  48.                     try {
  49.                         p.wait();
  50.                     } catch (InterruptedException e) {
  51.                         // TODO Auto-generated catch block
  52.                         e.printStackTrace();
  53.                     }
  54.                 }
  55.                 System.out.println("消费者消费了"+p.name+" 价格:"+p.price);
  56.                 p.flag = false;
  57.                 p.notifyAll();
  58.             }
  59.         }
  60.     }
  61. }
  62. public class Demo1 {
  63.     public static void main(String[] args) {
  64.         Product p = new Product();
  65.         Producer producer = new Producer(p);
  66.         Customer customer = new Customer(p);
  67.         producer.start();
  68.         customer.start();
  69.     }
  70. }

这是典型的生产者与消费者问题,明显应该是先生产者生产一条,然后消费者消费一条,循环而已。但是eclipse竟然运行结果为如下



非常不可思议,为什么会这样呢?代码绝逼没错啊,不可能消费者先输出啊,即便是消费者先输出,他是如何获取name和price的呢?如果把while(true)改成for循环少输出一点,就不会这样了。得出结论:应该是eclipse的控制台显示问题。

后来跟那位朋友讨论了一下,他说是如下图的勾要去掉,最终问题解决了





本文链接:https://liuyanzhao.com/4815.html
  • 微信
  • 交流学习,资料分享
  • weinxin
  • 个人淘宝
  • 店铺名:言曌博客咨询部

  • (部分商品未及时上架淘宝)
avatar

发表评论

avatar 登录者:匿名
匿名评论,评论回复后会有邮件通知

  

已通过评论:0   待审核评论数:0