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

© 安宁.沉睡 初级黑马   /  2014-8-18 09:41  /  1558 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  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开始编号,为什么先运行的是输出????

11 个回复

倒序浏览
将flage初始化为false,或true结果都是先运行输出线程,为什么呢???
回复 使用道具 举报
运行速度太快,你加点延长时间看一下
回复 使用道具 举报
Ezreal 发表于 2014-8-18 09:46
运行速度太快,你加点延长时间看一下

在打印代码之后加了个sleep(10)据正常了,真是谢谢了,我说怎么找了半天都没找到错误呢:)
回复 使用道具 举报
在打印代码后加        try {
                        Thread.sleep(10);
                } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
就可以了
回复 使用道具 举报
在打印代码后加        try {
                         Thread.sleep(10);
                 } catch (InterruptedException e) {
                         // TODO Auto-generated catch block
                         e.printStackTrace();
                 }
回复 使用道具 举报
没想到运行太快也会出问题啊,真是的害我找了半天都没找到
回复 使用道具 举报
Ezreal 中级黑马 2014-8-18 11:09:52
8#
安宁.沉睡 发表于 2014-8-18 10:59
在打印代码之后加了个sleep(10)据正常了,真是谢谢了,我说怎么找了半天都没找到错误呢 ...

本身是没错的,只是CPU运行速度是感觉不出来的。客气:)
回复 使用道具 举报
学习了,非常好的学习机会
回复 使用道具 举报
给代码加睡眠试试
回复 使用道具 举报
让我在这也学到了                        
回复 使用道具 举报
每个问题都是可以学到的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马