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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

rt,

三线程,分别是   生产者--->消费者--->吃货,三者同步。代码如下:
  1. import java.util.concurrent.locks.*;

  2. class Mooncake
  3. {
  4.         private Mooncake(){}//单例模式
  5.         private static final Mooncake mooncake = new Mooncake();
  6.         public static Mooncake getInstance()
  7.         {
  8.                 return mooncake;
  9.         }
  10.         private String shape;
  11.         private String taste;
  12.         private int flag = 0;//初始化资源状态为0(0表示生产者可以进行,1表示消费者可以进行,2表示吃货可以进行)
  13.        
  14.         ReentrantLock lock = new ReentrantLock();//获取锁的实例对象
  15.        
  16.         Condition condition_pro = lock.newCondition();//创建同一个锁对应的三种不同condition实例
  17.         Condition condition_con = lock.newCondition();
  18.         Condition condition_foo = lock.newCondition();

  19.         public void setMooncake(String shape,String taste)throws InterruptedException//声明await方法产生的异常
  20.         {
  21.                 lock.lock();//加锁
  22.                 try
  23.                 {
  24.                         while (flag!=0)//如果资源状态不是0,则等待
  25.                                 condition_pro.await();

  26.                         this.shape = shape;
  27.                         this.taste = taste;
  28.                         System.out.println("生产了一个::"+shape+"形::"+taste+"口味的月饼::");
  29.                         flag = (flag+1)%3;//切换资源状态
  30.                         condition_con.signal();//生产结束后唤醒消费者
  31.                 }
  32.                 finally
  33.                 {
  34.                         lock.unlock();//释放锁资源
  35.                 }
  36.         }

  37.         public void getMooncake()throws InterruptedException
  38.         {
  39.                 lock.lock();//加锁
  40.                 try
  41.                 {
  42.                         while(flag!=1)
  43.                                 condition_con.await();//如果资源状态不是1,则等待
  44.                         System.out.println("消费了一个~~~~~~~"+shape+"形~~~~~~~"+taste+"口味的月饼~~~~~~~");
  45.                         flag = (flag+1)%3;//切换资源状态
  46.                         condition_foo.signal();//消费结束后唤醒吃货
  47.                 }
  48.                 finally
  49.                 {
  50.                         lock.unlock();//释放锁
  51.                 }
  52.         }

  53.         public void eatMooncake()throws InterruptedException
  54.         {
  55.                 lock.lock();//加锁
  56.                 try
  57.                 {
  58.                         while(flag!=2)
  59.                                 condition_foo.await();//如果资源状态不是2,则等待
  60.                         System.out.println("吃了一个............"+shape+"形............"+taste+"口味的月饼............");
  61.                         System.out.println();
  62.                         flag = (flag+1)%3;//切换资源状态
  63.                         condition_pro.signal();//唤醒生产者
  64.                 }
  65.                 finally
  66.                 {
  67.                         lock.unlock();//释放锁资源
  68.                 }
  69.         }
  70. }

  71. class Producer implements Runnable
  72. {
  73.         public void run()
  74.         {
  75.                 while (true)
  76.                 {
  77.                         try
  78.                         {
  79.                                 Mooncake.getInstance().setMooncake("圆","水果");
  80.                         }
  81.                         catch (InterruptedException e)
  82.                         {
  83.                         }
  84.                        
  85.                 }
  86.         }
  87. }

  88. class Consumer implements Runnable
  89. {
  90.         public void run()
  91.         {
  92.                 while (true)
  93.                 {
  94.                         try
  95.                         {
  96.                                 Mooncake.getInstance().getMooncake();
  97.                         }
  98.                         catch (InterruptedException e)
  99.                         {
  100.                         }
  101.                 }
  102.                
  103.         }
  104. }       

  105. class Foodie implements Runnable
  106. {
  107.         public void run()
  108.         {
  109.                 while (true)
  110.                 {
  111.                         try
  112.                         {
  113.                                 Mooncake.getInstance().eatMooncake();
  114.                         }
  115.                         catch (InterruptedException e)
  116.                         {
  117.                         }
  118.                 }
  119.         }
  120. }

  121. class  ProducerMooncake0
  122. {
  123.         public static void main(String[] args)
  124.         {
  125.                 new Thread(new Producer()).start();
  126.                 new Thread(new Consumer()).start();
  127.                 new Thread(new Foodie()).start();
  128.         }
  129. }
复制代码
睡觉去了。。。困~

评分

参与人数 1技术分 +1 收起 理由
曹睿翔 + 1 神马都是浮云

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马