1.要理解生产消费者问题,首先应弄清PV操作的含义:PV操作是由P操作原语和V操作原语组成(原语是不可中断的过程),对信号量进行操作,具体定义如下: P(S):①将信号量S的值减1,即S=S-1;
②如果S³0,则该进程继续执行;否则该进程置为等待状态,排入等待队列。
V(S):①将信号量S的值加1,即S=S+1;
②如果S>0,则该进程继续执行;否则释放队列中第一个等待信号量的进程。
P操作与V操作到底有什么作用呢。
P操作相当于申请资源,而V操作相当于释放资源。
P操作—–à申请资源
V操作—-à释放资源
Java代码:
package com.jiangcheng.thread;
/**
*
* @author Administrator
*
*/
public class ProducerAndConsumer {
public static void main(String[] args) {
Queue queue = new Queue();
Producer producer = new Producer(queue);
Consumer consumer= new Consumer(queue);
producer.start();
consumer.start();
}
}
class Queue{
int value; // 资源值
boolean bFull= false; //存取控制变量
public synchronized void put( int value){
while( bFull){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this. value=value;
bFull= true; //将存取控制变量设为true
this.notifyAll(); //资源生产出来了,唤醒别的消费者线程
}
public synchronized int get(){
while(!bFull){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
bFull= false;
this.notifyAll();
return value;
}
}
/**
* 生产者类
*/
class Producer extends Thread{
Queue queue;
public Producer(Queue queue){
this. queue=queue;
}
public void run(){
for( inti = 0 ; i < 10 ;i++){
queue.put(i);
System. out.println( "Producer put :"+i);
}
}
}
class Consumer extends Thread{
Queue queue;
public Consumer(Queue queue){
this. queue=queue;
}
public void run(){
while( true){
int value= queue.get();
System. out.println( "Consumer get: " +value);
}
}
}