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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 广驰 中级黑马   /  2012-8-28 15:57  /  1060 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 应广驰 于 2012-8-28 16:08 编辑
  1. package ygc;

  2. public class SuoDemo
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 Resource r = new Resource();
  7.                 Put p = new Put(r);
  8.                 Out o = new Out(r);

  9.                 Thread t1 = new Thread(p,"生产1");
  10.                 Thread t2 = new Thread(p,"生产2");
  11.                 Thread t3 = new Thread(o,"消费");
  12.                
  13.                 t1.start();
  14.                 t2.start();
  15.                 t3.start();
  16.         
  17.         }

  18. }

  19. class Resource
  20. {
  21.         private String name;
  22.         private int count = 1;
  23.         private int x = 100;
  24.         private boolean flag = false;
  25.         
  26.         public synchronized void set(String name)
  27.         {
  28.                 while(x>0)
  29.                 {
  30.                         if(flag)
  31.                         {
  32.                                 try
  33.                                 {
  34.                                         wait();
  35.                                 }
  36.                                 catch(Exception e){}
  37.                         }

  38.                         this.name = name + "-----" +count++;
  39.                         System.out.println(Thread.currentThread().getName()+this.name);
  40.                         flag = true;
  41.                         x--;
  42.                         this.notify();
  43.                 }
  44.         }

  45.         public synchronized void out()
  46.         {
  47.                 while(x>0)
  48.                 {
  49.                         if(!flag)
  50.                         {
  51.                                 try
  52.                                 {
  53.                                         wait();
  54.                                 }
  55.                                 catch(Exception e)
  56.                                 {

  57.                                 }
  58.                         }
  59.                         System.out.println(Thread.currentThread().getName()+this.name);
  60.                         flag = false;
  61.                         this.notify();
  62.                 }
  63.         }
  64. }

  65. class Put implements Runnable
  66. {
  67.         private Resource r;
  68.         Put(Resource r)
  69.         {
  70.                 this.r = r;
  71.         }
  72.         public void run()
  73.         {
  74.                 r.set("物品");
  75.         }
  76. }

  77. class Out implements Runnable
  78. {

  79.         private Resource r;
  80.         Out(Resource r)
  81.         {
  82.                 this.r = r;
  83.         }
  84.         public void run()
  85.         {
  86.                 r.out();
  87.         }
  88. }
复制代码
生产2物品-----26
生产1物品-----27
消费物品-----27
为什么会出现这样的结果,一个Put的线程操作完不是应该out的线程操作,put的另一个线程因为锁上进不来么,怎么会put的线程操作了两次呢
在一个线程冻结的时候,另一个不是因为锁上无法操作了么
每次好像想到点子上了,头脑就自己绕浆糊了,思路又乱了,各位帮忙看一下

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1

查看全部评分

1 个回复

倒序浏览

class Resource
{
        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){}
                this.name = name+"---"+count++;
                System.out.println(Thread.currentThread().getName()+"...生产者...."+this.name);
                flag = true;
                this.notify();
        }

        public synchronized void out()
        {
                if(!flag)
                        try{this.wait();}catch(Exception e){}
                System.out.println(Thread.currentThread().getName()+"...消费者......."+this.name);
                flag = false;
                this.notify();
        }
}

class Producer implements Runnable
{
        private Resource res;

        Producer(Resource res)
        {
                this.res = res;
        }

        public void run()
        {
                while(true)
                {
                        res.set("+商品+");
                }
        }
}

class Consumer implements Runnable
{
        private Resource res;
       
        Consumer(Resource res)
        {
                this.res = res;
        }

        public void run()
        {
                while(true)
                {
                        res.out();
                }
        }
}


class ProducerConsumerDemo
{
        public static void main(String[] args)
        {
                Resource r = new Resource();

                Producer pro = new Producer(r);
                Consumer con = new Consumer(r);

                Thread t1 = new Thread(pro);
                Thread t2 = new Thread(pro);
                Thread t3 = new Thread(con);
                //Thread t4 = new Thread(con);//注释了这个当你put了2个的时候,就要对应的2个out去消费,当你只有一个的时候out的时候却要去生产2个,你加了锁就说明一定要2个都生产完才可以out。

                t1.start();
                t2.start();
                t3.start();
                //t4.start();//和上面都一样。
               
        }
}


这是我运行的结果,和你那个是一样的。
Thread-0...生产者....+商品+---74
Thread-1...生产者....+商品+---75
Thread-2...消费者.......+商品+---75
Thread-0...生产者....+商品+---76
Thread-1...生产者....+商品+---77
Thread-2...消费者.......+商品+---77
Thread-0...生产者....+商品+---78
Thread-1...生产者....+商品+---79

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马