zoukankan      html  css  js  c++  java
  • Java线程(学习整理)--4---一个简单的生产者、消费者模型

     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¥
  • 相关阅读:
    程序员式的幽默(灌水)
    你应该知道的
    WPF控件应用[0]
    WPF控件应用[2]
    C#调用Win32 的API函数User32.dll
    C#获取当前行号
    C#导入excel重写
    [转]wpf相关好资源
    使用C#和Excel进行报表开发-生成统计图Chart
    [转]用 delphi 创建一个服务程序
  • 原文地址:https://www.cnblogs.com/newwind/p/5658477.html
Copyright © 2011-2022 走看看