码迷,mamicode.com
首页 > 编程语言 > 详细

Java线程学习整理--4---一个简单的生产者、消费者模型

时间:2016-07-10 21:48:44      阅读:244      评论:0      收藏:0      [点我收藏+]

标签:

 1、简单的小例子:

    下面这个例子主要观察的是:

        一个对象的wait()和notify()使用情况! 

    当一个对象调用了wait(),那么当前掌握该对象锁标记的线程,就会让出CPU的使用权,转而进入该对象的等待池中等待唤醒,这里说明一下,每一个对象都有一个独立的等待池和锁池!

    等待池:上述的wait()后的线程会进入等待池中,处于下图线程声明周期(简单示意图)

技术分享

    中的技术分享这个状态,等待池中的线程任然具有对象的锁标记,但是处于休眠状态,不是可运行状态!

 

    当该对象调用notify方法之后,就会在等待池中系统会选择一个线程被唤醒,等待队列中的这个线程释放,此线程进入锁池状态。被唤醒的线程就会转换状态,

从等待的休眠状态--->可运行状态,借着参与CPU的使用权的争夺!

 

  1 package cn.sxt.runnables;
  2 
  3 import com.sun.org.apache.xalan.internal.xsltc.compiler.sym;
  4 /**
  5  * 简单的生产者和消费者模型:
  6  * @author 小风微灵
  7  *
  8  */
  9 
 10 /**
 11  * 产品类
 12  * @author 小风微灵
 13  *
 14  */
 15 class Product{
 16     
 17     String name;    //名称
 18     
 19     float price;    //价格
 20     
 21     boolean isTrue=false;//    是否开始生产
 22     
 23 }
 24 /**
 25  * 生产者类
 26  * @author 小风微灵
 27  *
 28  */
 29 class Sale extends Thread{
 30     
 31     private Product p=null;
 32     
 33     public Sale(Product p){
 34         this.p=p;
 35     }
 36     
 37     public void run() {
 38         int i=0;
 39         while(true){
 40             synchronized (p) {
 41                 if(p.isTrue==false){
 42                     
 43                         if(i%2==0){
 44                             p.name="西红柿";
 45                             p.price=4;
 46                             System.out.println("生产者生产了:西红柿,价格:4¥");
 47                         }else{
 48                             p.name="黄瓜";
 49                             p.price=2.5f;
 50                             System.out.println("生产者生产了:黄瓜,价格:2.5¥");
 51                         }
 52                         p.isTrue=true;
 53                         i++;
 54                     
 55                 }else{
 56                     try {
 57                         p.wait();    //生产暂停,开始消费
 58                     } catch (InterruptedException e) {
 59                         e.printStackTrace();
 60                     }
 61                 }
 62             }    
 63         }
 64     }
 65     
 66 }
 67 
 68 class Custom extends Thread{
 69     private Product p=null;
 70     
 71     public Custom(Product p){
 72         this.p=p;
 73     }
 74     
 75     public void run() {
 76         
 77         while(true){
 78             synchronized (p) {    
 79                 if(p.isTrue){
 80                                     
 81                         System.out.println("消费者生产了:"+p.name+",价格:"+p.price+"¥");
 82                     
 83                     p.isTrue=false;
 84                 }else{
 85                     p.notify();    //消费暂停,开始生产
 86                 }
 87             }
 88         }
 89     }
 90 }
 91 
 92 
 93 public class Producer_Custom {
 94 
 95     
 96     public static void main(String[] args) {
 97         
 98         Product p=new Product();
 99         
100         Sale sale=new Sale(p);    
101         sale.start();
102         Custom custom=new Custom(p);        
103         custom.start();
104     }
105 
106 }

 运行结果:

生产者生产了:西红柿,价格:4¥
消费者生产了:西红柿,价格:4.0¥
生产者生产了:黄瓜,价格:2.5¥
消费者生产了:黄瓜,价格:2.5¥
生产者生产了:西红柿,价格:4¥
消费者生产了:西红柿,价格:4.0¥

 

Java线程学习整理--4---一个简单的生产者、消费者模型

标签:

原文地址:http://www.cnblogs.com/newwind/p/5658477.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!