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¥