黑马程序员技术交流社区

标题: 代码运行结果跟预想不同??? [打印本页]

作者: 安宁.沉睡    时间: 2014-8-18 09:41
标题: 代码运行结果跟预想不同???
  1. package test;

  2. public class RunnableMassageDemo2 {

  3.         /**
  4.          * @param args
  5.          */
  6.         public static void main(String[] args) {
  7.                 Source2 source=new Source2();
  8.                 InSource2 insource=new InSource2(source);
  9.                 OutSource2 outsource=new OutSource2(source);
  10.                 new Thread(insource).start();
  11.                 new Thread(outsource).start();
  12.                 new Thread(insource).start();
  13.                 new Thread(outsource).start();


  14.         }

  15. }

  16. class Source2
  17. {
  18.         private String name;
  19.         private int num=0;
  20.         private boolean flag=true;
  21.         public synchronized void Setns()
  22.         {
  23.                
  24.                         while(flag){
  25.                                 try {
  26.                                         this.wait();
  27.                                 } catch (InterruptedException e) {
  28.                                        
  29.                                 }
  30.                         }
  31.        
  32.                 name="商品"+num++;

  33.                 System.out.println("生产  "+name);
  34.         flag=true;
  35.         this.notifyAll();
  36.         }
  37.          public synchronized void getns()
  38.          {
  39.                                 while(!flag){
  40.                                 try {
  41.                                         this.wait();
  42.                                 } catch (InterruptedException e) {
  43.                                        
  44.                                         e.printStackTrace();
  45.                                 }
  46.                                 }
  47.                         System.out.println("           消费  "+name);
  48.                         flag=false;
  49.                         this.notifyAll();
  50.                
  51.          }
  52. }

  53.        
  54.        
  55.        
  56. class InSource2 implements Runnable
  57. {
  58.         int a=0;
  59.         Source2 source;
  60.         InSource2(Source2 source)
  61.         {
  62.                 this.source=source;
  63.         }
  64.         public void In()
  65.         {
  66.                         source.Setns();
  67.                         }
  68.        
  69.         public void run()
  70.         {
  71.                 while(true){
  72.                 In();
  73.                 }
  74.         }
  75.        
  76.         }
  77. class OutSource2 implements Runnable
  78. {
  79.         Source2 source;
  80.         OutSource2(Source2 source)
  81.         {
  82.                 this.source=source;
  83.         }
  84.         public synchronized void Out()
  85.         {
  86.                 source.getns();
  87.         }
  88.         public void run()
  89.         {
  90.                 while(true){
  91.                 Out();
  92.                 }
  93.         }
  94.         }
复制代码

运行结果:
  消费  商品42300
生产  商品42301
           消费  商品42301
生产  商品42302
           消费  商品42302
生产  商品42303
           消费  商品42303
生产  商品42304
           消费  商品42304
生产  商品42305
           消费  商品42305
生产  商品42306
           消费  商品42306
生产  商品42307
           消费  商品42307
生产  商品42308
           消费  商品42308
生产  商品42309
           消费  商品42309
生产  商品42310
           消费  商品42310
生产  商品42311
           消费  商品42311



为什么不是从0开始编号,为什么先运行的是输出????
作者: 安宁.沉睡    时间: 2014-8-18 09:44
将flage初始化为false,或true结果都是先运行输出线程,为什么呢???
作者: Ezreal    时间: 2014-8-18 09:46
运行速度太快,你加点延长时间看一下
作者: 安宁.沉睡    时间: 2014-8-18 10:59
Ezreal 发表于 2014-8-18 09:46
运行速度太快,你加点延长时间看一下

在打印代码之后加了个sleep(10)据正常了,真是谢谢了,我说怎么找了半天都没找到错误呢:)
作者: 安宁.沉睡    时间: 2014-8-18 11:02
在打印代码后加        try {
                        Thread.sleep(10);
                } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
就可以了
作者: 3040789425    时间: 2014-8-18 11:03
在打印代码后加        try {
                         Thread.sleep(10);
                 } catch (InterruptedException e) {
                         // TODO Auto-generated catch block
                         e.printStackTrace();
                 }

作者: 3040789425    时间: 2014-8-18 11:05
没想到运行太快也会出问题啊,真是的害我找了半天都没找到
作者: Ezreal    时间: 2014-8-18 11:09
安宁.沉睡 发表于 2014-8-18 10:59
在打印代码之后加了个sleep(10)据正常了,真是谢谢了,我说怎么找了半天都没找到错误呢 ...

本身是没错的,只是CPU运行速度是感觉不出来的。客气:)
作者: 大成哥    时间: 2014-8-18 11:13
学习了,非常好的学习机会
作者: 笑轻轻    时间: 2014-8-18 11:24
给代码加睡眠试试
作者: 3040789425    时间: 2014-8-18 11:57
让我在这也学到了                        
作者: 安宁.沉睡    时间: 2014-8-20 10:13
每个问题都是可以学到的




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