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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陌路行者 中级黑马   /  2013-7-4 12:24  /  1069 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 陌路行者 于 2013-7-4 13:58 编辑
  1. import java.util.concurrent.locks.*;
  2. class Res
  3. {
  4.         private String name;
  5.         private String sex;
  6.         private boolean flag = false;
  7.         Lock lock = new ReentrantLock();
  8.         Condition condition_in = lock.newCondition();
  9.         Condition condition_out = lock.newCondition();
  10.         public void set(String name,String sex) throws InterruptedException
  11.         {
  12.                 lock.lock();
  13.                 if(flag)
  14.                         try
  15.                         {
  16.                                 condition_in.await();
  17.                                 this.name = name;
  18.                                 this.sex = sex;
  19.                                 flag = true;
  20.                                 condition_out.signal();
  21.                         }         
  22.                         finally
  23.                         {
  24.                                 lock.unlock();
  25.                         }
  26.         }
  27.         public void out()throws InterruptedException
  28.         {
  29.                 lock.lock();
  30.                 if(!flag)
  31.                         try
  32.                         {
  33.                                 condition_out.await();
  34.                                 System.out.println(name+".........."+sex);
  35.                                 flag = false;
  36.                                 condition_in.signal();
  37.                         }
  38.                 finally
  39.                 {
  40.                         lock.unlock();
  41.                 }

  42.         }
  43. }
  44. class Input implements Runnable
  45. {
  46.         private Res r;
  47.         Input(Res r)
  48.         {
  49.                 this.r = r;
  50.         }
  51.         public void run()
  52.         {
  53.                 int x = 0;
  54.                 while(true)
  55.                 {
  56.                         if(x==0)
  57.                         {
  58.                                 try
  59.                                 {
  60.                                         r.set("mike","man");
  61.                                 }
  62.                                 catch (InterruptedException e)
  63.                                 {
  64.                                 }               
  65.                         }
  66.                         else
  67.                         {
  68.                                 try
  69.                                 {
  70.                                         r.set("丽丽","女女女");
  71.                                 }
  72.                                 catch (InterruptedException e)
  73.                                 {
  74.                                 }                        
  75.                         }
  76.                         x = (x+1)%2;        
  77.                 }                                
  78.         }        
  79. }
  80. class Output implements Runnable
  81. {
  82.         private Res r;
  83.         Output(Res r)
  84.         {
  85.                 this.r = r;
  86.         }
  87.         public void run()
  88.         {
  89.                 while(true)
  90.                 {
  91.                         try
  92.                         {
  93.                                 r.out();
  94.                         }
  95.                         catch (InterruptedException e)
  96.                         {
  97.                         }               
  98.                 }
  99.         }
  100. }
  101. class  InputOutputDemo2
  102. {
  103.         public static void main(String[] args)
  104.         {
  105.                 Res r = new Res();
  106.                 new Thread(new Input(r)).start();
  107.                 new Thread(new Input(r)).start();
  108.                 new Thread(new Output(r)).start();
  109.                 new Thread(new Output(r)).start();

  110.         }
  111. }
复制代码

为啥子为是这个样子呢?

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

5 个回复

倒序浏览
看红字:
import java.util.concurrent.locks.*;
class Res
{
        private String name;
        private String sex;
        private boolean flag = false;
        Lock lock = new ReentrantLock();
        Condition condition_in = lock.newCondition();
        Condition condition_out = lock.newCondition();
        public void set(String name,String sex) throws InterruptedException
        {
                lock.lock();
                //if(flag)//线程等待条件有问题应该放在下面
                        try
                        {
                         if(flag)//放在这里
                                condition_in.await();
                                this.name = name;
                                this.sex = sex;
                                flag = true;
                                condition_out.signal();
                        }         
                        finally
                        {
                                lock.unlock();
                        }
        }
        public void out()throws InterruptedException
        {
                lock.lock();
                //if(!flag)//线程等待条件有问题应该放在下面
                        try
                        {
                         if(!flag)//放在这里
                                condition_out.await();
                                System.out.println(name+".........."+sex);
                                flag = false;
                                condition_in.signal();
                        }
                finally
                {
                        lock.unlock();
                }

        }
}
class Input implements Runnable
{
        private Res r;
        Input(Res r)
        {
                this.r = r;
        }
        public void run()
        {
                int x = 0;
                while(true)
                {
                        if(x==0)
                        {
                                try
                                {
                                 
                                        r.set("mike","man");
                                }
                                catch (InterruptedException e)
                                {
                                }               
                        }
                        else
                        {
                                try
                                {
                                        r.set("丽丽","女女女");
                                }
                                catch (InterruptedException e)
                                {
                                }                        
                        }
                        x = (x+1)%2;        
                }                                
        }        
}
class Output implements Runnable
{
        private Res r;
        Output(Res r)
        {
                this.r = r;
        }
        public void run()
        {
                while(true)
                {
                        try
                        {
                                r.out();
                        }
                        catch (InterruptedException e)
                        {
                        }               
                }
        }
}
class  InputOutputDemo2
{
        public static void main(String[] args)
        {
                Res r = new Res();
                new Thread(new Input(r)).start();
                new Thread(new Input(r)).start();
                new Thread(new Output(r)).start();
                new Thread(new Output(r)).start();
        }
}


评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 陌路行者 于 2013-7-4 14:03 编辑

哦了{:soso_e128:}     谢过!    只怪自己粗心大意
回复 使用道具 举报
每次看到楼主的头像我都很不淡定......
回复 使用道具 举报
郑先明 发表于 2013-7-4 18:00
每次看到楼主的头像我都很不淡定......

这是为什么呢
回复 使用道具 举报

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