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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 韩秀山 中级黑马   /  2013-5-15 16:51  /  946 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

学到了线程了,但是老师说有一个,生产者和消费者的例子不怎么好理解。希望谁能帮我写一下。。一定要有详细的注释。我好没学到那里,没注释看不懂!!!

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

2 个回复

倒序浏览
  1. import java.util.concurrent.locks.*;
  2. class ProducerConsumerDemo2
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 Res r=new Res();//创建一个资源对象
  7.                 Producer pro=new Producer(r);//创建一个生产者
  8.                 Consumer con=new Consumer(r);//创建一个消费者

  9.                 Thread t1=new Thread(pro);
  10.                 Thread t2=new Thread(pro);//创建以上两个线程,即两个生产者线程t1,t2
  11.                 Thread t3=new Thread(con);
  12.                 Thread t4=new Thread(con);//创建以上两个线程,即两个消费者线程t3,t4
  13.                 t1.start();
  14.                 t2.start();
  15.                 t3.start();
  16.                 t4.start();//开启四个线程
  17.         }
  18. }
  19. class Res
  20. {
  21.         private String name;
  22.         private int count=1;
  23.         private boolean flag=false;
  24.         private Lock lock=new ReentrantLock();//创建一个锁
  25.         private Condition condition_pro=lock.newCondition();//该方法是创建一个生产者的Contion对象,目的是执行相应的线程,如只执行生产者的等待和唤醒。
  26.         private Condition condition_con=lock.newCondition();//该方法是创建一个消费者的Contion对象,目的同上。
  27.         /*这个方法是生产者生产商品的方法。*/
  28.         public synchronized void set(String name)throws InterruptedException{
  29.                 lock.lock();//上锁
  30.                 try{
  31.                         while(flag)//若flag为true,表示已经有一个商品了,执行await语句抛出异常。若为false,表示还没有商品,生产者需要生产,则await()句不执行,执行下一句代码。
  32.                                 condition_pro.await();//那么此时,因为可能还没有被消费者消费,所以为了让生产者不产生新的商品,故让所以生产者线程等待。抛出异常。执行finally语句解锁。
  33.                         this.name=name+"..."+(count++);
  34.                         System.out.println(Thread.currentThread().getName()+"生产者..."+this.name);//可以理解为生产商品的语句。
  35.                         flag=true;//以上语句的意思是生产者已经生产了一个产品,所以用flag=true告诉他们现在有一个商品了。
  36.                         condition_con.signal();//唤醒所有消费者线程。
  37.                 }
  38.                 finally{//加上finally是为了当是否抛出异常时,都能将锁释放,要不然其他线程进不来。
  39.                         lock.unlock();//解锁
  40.                 }
  41.         }
  42.         /*这个方法是消费者消费商品的方法。上锁解锁的方法如上*/
  43.         public void out()throws InterruptedException{
  44.                 lock.lock();
  45.                 try{
  46.                         while(!flag)//当flag=false时,!flag=true,表示此时容器里没有商品,消费者不能消费。故用await让所有消费者线程等待。
  47.                                 condition_con.await();
  48.                         System.out.println(Thread.currentThread().getName()+"消费者........."+this.name);//可以理解为消费商品的语句。
  49.                         flag=false;//商品消费完,容器里没有商品了,故把标记变为false.
  50.                         condition_pro.signalAll();//唤醒线程池里所有的生产者线程。
  51.                 }
  52.                 finally{
  53.                         lock.unlock();
  54.                 }
  55.         }
  56. }
  57. class Producer implements Runnable//这个是生产者线程,创建商品。
  58. {
  59.         private Res r;
  60.         Producer(Res r){
  61.                 this.r=r;
  62.         }
  63.         public void run(){
  64.                 while(true){
  65.                         try{
  66.                                 r.set("+商品+");
  67.                         }
  68.                         catch(InterruptedException e){}
  69.                 }
  70.         }
  71. }
  72. class Consumer implements Runnable//这个是消费者者线程,消费商品。
  73. {
  74.         private Res r;
  75.         Consumer(Res r){
  76.                 this.r=r;
  77.         }
  78.         public void run(){
  79.                 while(true){
  80.                         try{
  81.                                 r.out();
  82.                         }
  83.                         catch(InterruptedException e){}
  84.                 }
  85.         }
  86. }
复制代码
代码可以直接运行的,不知道说的会不会太乱,你能不能理解额~

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1

查看全部评分

回复 使用道具 举报
如果问题已经解决了,那么大家请把帖子的类型改为“已解决”,在自己帖子的左下角点编辑,然后选择帖子的分类进行改正。{:soso_e163:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马