A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陪你等日出 中级黑马   /  2013-12-15 10:56  /  1290 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 陪你等日出 于 2013-12-17 15:21 编辑
  1. /*
  2. 需求:线程间的通信,模拟生产者与消费者
  3. */
  4. class TongXinDemo
  5. {
  6.         public static void main(String[] args)
  7.         {
  8.                 Res res = new Res();
  9.                 Pro p = new Pro(res);//生产者
  10.                 Con c = new Con(res);//消费者
  11.                 Thread t1 = new Thread(p);
  12.                 Thread t2 = new Thread(c);
  13.                 t1.start();//生产
  14.                 t2.start();//消费
  15.         }
  16. }
  17. class Res
  18. {
  19.         private String name;
  20.         private int count=1;
  21.         private boolean flag=false;
  22.         //生产功能
  23.         public synchronized void set(String name)
  24.         {
  25.                 //如果flag为真,也就是如果已经有了商品,就wait
  26.                 if (flag)
  27.                 {
  28.                         try
  29.                         {
  30.                                 this.wait();
  31.                         }
  32.                         catch (Exception e)
  33.                         {
  34.                                 e.printStackTrace();
  35.                         }
  36.                 }
  37.                 this.name = name+"..."+count++;
  38.                 System.out.println(Thread.currentThread().getName()+"...生产者..."+this.name);
  39.                 flag=true;
  40.                 this.notify();
  41.         }
  42.         public synchronized void out()
  43.         {
  44.                 if (!flag)
  45.                 {
  46.                         try
  47.                         {
  48.                                 this.wait();
  49.                         }
  50.                         catch (Exception e)
  51.                         {
  52.                                 e.printStackTrace();
  53.                         }
  54.                 }
  55.                 System.out.println(Thread.currentThread().getName()+"........消费者..."+this.name);
  56.                 flag=false;
  57.                 this.notify();
  58.         }
  59. }
  60. //生产
  61. class Pro implements Runnable
  62. {
  63.         private Res res;
  64.         Pro(Res res)
  65.         {
  66.                 this.res=res;
  67.         }
  68.         public void run()
  69.         {
  70.                 while (true)
  71.                 {
  72.                         res.set("--商品--");
  73.                 }
  74.         }
  75. }
  76. //消费
  77. class Con implements Runnable
  78. {
  79.         private Res res;
  80.         Con(Res res)
  81.         {
  82.                 this.res=res;
  83.         }
  84.         public void run()
  85.         {
  86.                 while (true)
  87.                 {
  88.                         res.out();
  89.                 }
  90.         }
  91. }
复制代码


大家,这哪里有问题啊,怎么就是编译不通过?

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

3 个回复

倒序浏览
本帖最后由 回音 于 2013-12-15 12:01 编辑

public class Test
{
        public static void main(String[] args)
        {
                Res res = new Res();
                Producer p = new Producer(res);
                Consumer c = new Consumer(res);
                Thread t1 = new Thread(p);
                Thread t2 = new Thread(c);
                t1.start();
                t2.start();
        }
}
class Res
{
        private String name;
        private int count=1;
        private boolean flag=false;

        public synchronized void set(String name)
        {

                if (flag)
                {
                        try
                        {
                                this.wait();
                        }
                        catch (Exception e)
                        {
                                e.printStackTrace();
                        }
                }
                this.name = name+"..."+count++;
                System.out.println(Thread.currentThread().getName()+"...producer..."+this.name);
                flag=true;
                this.notify();
        }
        public synchronized void out()
        {
                if (!flag)
                {
                        try
                        {
                                this.wait();
                        }
                        catch (Exception e)
                        {
                                e.printStackTrace();
                        }
                }
                System.out.println(Thread.currentThread().getName()+"........consumer..."+this.name);
                flag=false;
                this.notify();
        }
}

class Producer implements Runnable
{
        private Res res;
        Producer(Res res)
        {
            this.res=res;
        }
        public void run()
        {
            while(true)
            {
                res.set("--commodity--");
            }
        }
}

class Consumer implements Runnable
{
        private Res res;
        Consumer(Res res)
        {
            this.res=res;
        }
        public void run()
        {
            while(true)
            {
                res.out();
            }
        }
}
改成这样就能运行了。非常神奇的,Con不能用作类名。CON,con,cOn,各种大小写组合都不行。你把con改成其他名字应该就可以了。
StackOverflow上有解释:http://stackoverflow.com/questions/6908825/is-this-a-bug-in-java-or-what。
这个bug不是jdk的问题,是windows的问题。con在windows中是保留字,不能作为文件名,所以con.class字节码文件就无法生成,jvm就不会找到con这个类。同样的bug会出现在其他类名上,你可以试一下:
CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, and LPT9
其实在windows中建立以上名字为文件名(后缀不限)的文件都是不允许的。





评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
高手啊!
回复 使用道具 举报
回音 发表于 2013-12-15 11:41
public class Test
{
        public static void main(String[] args)

感谢告知,我晕..怎么这么奇葩的事正好被我碰到
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马