最简单的生产者消费者问题PV操作解法
int buffer;
Semaphore sp=1,sc=0;
//下面进程并发执行
process producer(void)
{
while(1)
{
{生产一个产品product};
P(sp);
Buffer= product;
V(sc);
}
}
process consumer(void)
{
while(1)
{
P(sc);
{取走缓冲区的产品}
V(sp);
{消费该产品}
}
}
同样原理,下面是Java多线程并发执行(synchronized给线程对象加锁)来实现
product产品类
public class product {
private int n = 0;
private boolean flag= false;
private int i=1,j=1;
public synchronized void produce() {
System.out.println("剩余产品数:"+n);
System.out.println(Thread.currentThread().getName()+"开始执行");
if(flag) {
//如果已有产品则让生产者线程等待
try {
wait();
}catch(InterruptedException e) {e.printStackTrace();}
}
n++; //如果无产品则生产产品
System.out.println("已生产"+(i++)+"次");
flag = true;
notify(); //生产完后唤醒消费者线程
}
public synchronized void consume() {
System.out.println("剩余产品数:"+n);
System.out.println(Thread.currentThread().getName()+"开始执行");
if(!flag) {
//如果无产品则让消费者线程等待
try {
wait();
}catch(InterruptedException e) {e.printStackTrace();}
}
n--;
System.out.println("已消费"+(j++)+"次");
flag = false;
notify();
}
}
生产者类
public class producer extends Thread{
private product pro ; //产品对象
public producer(product pro) {
this.pro = pro;
}
public void run() {
while(true) {
try {
Thread.sleep(3000); //wait释放对象锁,sleep不会释放对象锁
}catch(InterruptedException e){e.printStackTrace();}
pro.produce(); //生产产品
}
}
}
消费者类
public class consumer extends Thread{
private product pro ; //产品对象
public consumer(product pro) {
this.pro = pro;
}
public void run() {
while(true) {
try {
Thread.sleep(3000); //wait释放对象锁,sleep不会释放对象锁
}catch(InterruptedException e){e.printStackTrace();}
pro.consume(); //消费产品
}
}
}
最后是main类
public class producer_consumer {
public static void main(String[] args) {
product pro = new product();
producer pThread = new producer(pro);
consumer cThread = new consumer(pro);
//pThread.start();
//cThread.start();
Thread t1 = new Thread(pThread,"生产者线程");
Thread t2 = new Thread(cThread,"消费者线程");
t1.start();
t2.start();
}
}