黑马程序员技术交流社区

标题: 关于线程同步问题,谁能告诉我这是什么鬼! [打印本页]

作者: 逍遥最好    时间: 2015-7-31 12:28
标题: 关于线程同步问题,谁能告诉我这是什么鬼!
  1. /*
  2. 生产者消费者的线程同步问题
  3. */
  4. class Res
  5. {
  6.         private String name;
  7.         private int count=1;
  8.         private boolean flag=false;
  9.         public synchronized void set(String name)
  10.         {
  11.                 if(flag)
  12.                         try{wait();}catch(Exception e){}
  13.                 this.name=name+"----"+count++;
  14.                 System.out.println(Thread.currentThread().getName()+"-------生产者--"+this.name);
  15.                 flag=true;
  16.                 notify();

  17.         }
  18.         public synchronized void out()
  19.         {
  20.                 if(!flag)
  21.                         try{wait();}catch(Exception e){}
  22.                 System.out.println(Thread.currentThread().getName()+"--------消费者------"+this.name);
  23.                 flag=false;
  24.                 notify();
  25.         }
  26. }
  27. class Pro implements Runnable
  28. {
  29.         private Res r;
  30.         Pro(Res r)
  31.         {
  32.                 this.r=r;
  33.         }
  34.         public void run()
  35.         {
  36.                 while(true)
  37.                 {
  38.                         r.set("冰激凌");
  39.                 }
  40.         }
  41.        
  42. }
  43. class Con implements Runnable
  44. {
  45.         private Res r;
  46.         Con(Res r)
  47.         {
  48.                 this.r=r;
  49.         }
  50.         public void run()
  51.         {                       
  52.                 while (true)
  53.                 {
  54.                         r.out();
  55.                 }
  56.        
  57.         }
  58. }

  59. class ProConDemo
  60. {
  61.         public static void main(String[] args)
  62.         {
  63.                 Res r=new Res();
  64.                 new Thread(new Pro(r)).start();
  65.                 new Thread(new Con(r)).start();
  66.         }
  67. }
复制代码





无标题.png (66.44 KB, 下载次数: 4)

无标题.png

作者: yefeidd    时间: 2015-7-31 12:59
似乎是越界了?
作者: g552092947    时间: 2015-7-31 13:43
你输入以下javac,看看输出的正确吗?要是出不来,只能说你JDk装的不兼容吧
作者: 逍遥最好    时间: 2015-7-31 16:34
g552092947 发表于 2015-7-31 13:43
你输入以下javac,看看输出的正确吗?要是出不来,只能说你JDk装的不兼容吧 ...

我输的就是javac啊,编译过程中变成了这样的。
作者: 逍遥最好    时间: 2015-7-31 16:35
yefeidd 发表于 2015-7-31 12:59
似乎是越界了?

什么越界了,代码有问题吗?
作者: JustForYou    时间: 2015-7-31 16:53
命令提示的是什么鬼啊,不会是编码出错了吧
作者: 逍遥最好    时间: 2015-7-31 20:14
JustForYou 发表于 2015-7-31 16:53
命令提示的是什么鬼啊,不会是编码出错了吧

你拿过去运行下,看是什么结果。
作者: fengjietian    时间: 2015-7-31 20:27
好像类名中间不能出现Con, 我改了一下,你试一试
  1. class Res
  2. {
  3.         private String name;
  4.         private int count=1;
  5.         private boolean flag=false;
  6.         public synchronized void set(String name)
  7.         {
  8.                 if(flag)
  9.                         try{wait();}catch(Exception e){}
  10.                 this.name=name+"----"+count++;
  11.                 System.out.println(Thread.currentThread().getName()+"-------生产者--"+this.name);
  12.                 flag=true;
  13.                 notify();

  14.         }
  15.         public synchronized void out()
  16.         {
  17.                 if(!flag)
  18.                         try{wait();}catch(Exception e){}
  19.                 System.out.println(Thread.currentThread().getName()+"--------消费者------"+this.name);
  20.                 flag=false;
  21.                 notify();
  22.         }
  23. }
  24. class Pro implements Runnable
  25. {
  26.         private Res r;
  27.         Pro(Res r)
  28.         {
  29.                 this.r=r;
  30.         }
  31.         public void run()
  32.         {
  33.                 while(true)
  34.                 {
  35.                         r.set("冰激凌");
  36.                 }
  37.         }
  38.         
  39. }
  40. class Con2 implements Runnable
  41. {
  42.         private Res r;
  43.         Con2(Res r)
  44.         {
  45.                 this.r=r;
  46.         }
  47.         public void run()
  48.         {                        
  49.                 while (true)
  50.                 {
  51.                         r.out();
  52.                 }
  53.         
  54.         }
  55. }

  56. public class Test
  57. {
  58.         public static void main(String[] args)
  59.         {
  60.                 Res r=new Res();
  61.                 new Thread(new Pro(r)).start();
  62.                 new Thread(new Con2(r)).start();
  63.         }
  64. }
复制代码

作者: 逍遥最好    时间: 2015-7-31 20:36
fengjietian 发表于 2015-7-31 20:27
好像类名中间不能出现Con, 我改了一下,你试一试

果然是高手,但是为什么不能出现Con,你是怎么发现的?
作者: fengjietian    时间: 2015-7-31 20:40
你根据编译器报错信息,搜索一下, 我用的是eclipse, 有报错信息。
解决了你支持一下我的答案啊




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2