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

时间:2023-03-08 16:28:16

 1、简单的小例子:

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

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

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

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

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

    中的Java线程(学习整理)--4---一个简单的生产者、消费者模型这个状态,等待池中的线程任然具有对象的锁标记,但是处于休眠状态,不是可运行状态!

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

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

 package cn.sxt.runnables;

 import com.sun.org.apache.xalan.internal.xsltc.compiler.sym;
/**
* 简单的生产者和消费者模型:
* @author 小风微灵
*
*/ /**
* 产品类
* @author 小风微灵
*
*/
class Product{ String name; //名称 float price; //价格 boolean isTrue=false;// 是否开始生产 }
/**
* 生产者类
* @author 小风微灵
*
*/
class Sale extends Thread{ private Product p=null; public Sale(Product p){
this.p=p;
} public void run() {
int i=0;
while(true){
synchronized (p) {
if(p.isTrue==false){ if(i%2==0){
p.name="西红柿";
p.price=4;
System.out.println("生产者生产了:西红柿,价格:4¥");
}else{
p.name="黄瓜";
p.price=2.5f;
System.out.println("生产者生产了:黄瓜,价格:2.5¥");
}
p.isTrue=true;
i++; }else{
try {
p.wait(); //生产暂停,开始消费
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
} } class Custom extends Thread{
private Product p=null; public Custom(Product p){
this.p=p;
} public void run() { while(true){
synchronized (p) {
if(p.isTrue){ System.out.println("消费者生产了:"+p.name+",价格:"+p.price+"¥"); p.isTrue=false;
}else{
p.notify(); //消费暂停,开始生产
}
}
}
}
} public class Producer_Custom { public static void main(String[] args) { Product p=new Product(); Sale sale=new Sale(p);
sale.start();
Custom custom=new Custom(p);
custom.start();
} }

运行结果:

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