解决生产者和消费者的同步与互斥问题
package Test;
import java.util.concurrent.Semaphore;
public class ProducerandConsumer {
public static void main(String[] args) {
Warehouse warehouse =new Warehouse();
Producer p1 = new Producer(warehouse,"生产者A");
Producer p2 = new Producer(warehouse,"生产者B");
Producer p3 = new Producer(warehouse,"生产者B");
Consumer c1 = new Consumer(warehouse,"消费者A");
Consumer c2 = new Consumer(warehouse,"消费者B");
Consumer c3 = new Consumer(warehouse,"消费者C");
p1.start();
p2.start();
p3.start();
c1.start();
c2.start();
c3.start();
}
}
class Sem{
public static final Semaphore PMUTEX = new Semaphore(1);//生产者互斥
public static final Semaphore CMUTEX = new Semaphore(1);//消费者互斥
public static final Semaphore Capacity = new Semaphore(10);//仓库中的位置数量
public static final Semaphore ProductSum = new Semaphore(0);//仓库中的产品数
}
class Warehouse{
int[] rack = new int[10];//表示初始的十个货架
private int put_index=0;//从第一个位置放产品
private int get_index=0;//从第一个位置取产品
public void put(int data) {
rack[put_index]=data;
System.out.println(Thread.currentThread().getName()+"向"+put_index+"放置产品"+data);
put_index=(put_index+1)%rack.length;//放置的位置后移
}
public int get() {
int data = rack[get_index];
System.out.println("\t\t\t"+Thread.currentThread().getName()+"从仓库"+get_index+"取出产品"+data);
get_index=(get_index+1)%rack.length;
return data;
}
}
class Producer extends Thread {
private Warehouse warehouse;
public Producer(Warehouse warehouse,String name) {
super(name);
this.warehouse=warehouse;
}
public void run() {
while(true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//1.生产产品
int data = (int)(Math.random()*1000);
try {
Sem.Capacity.acquire();//P(Capacity)
Sem.PMUTEX.acquire();//P(PMUTEX)
} catch (InterruptedException e) {
e.printStackTrace();
}
//2.把产品放入仓库
warehouse.put(data);
Sem.PMUTEX.release();//V(PMUTEX)
Sem.ProductSum.release();//V(ProductSum)
}
}
}
class Consumer extends Thread {
private Warehouse warehouse;
public Consumer(Warehouse warehouse,String name) {
super(name);
this.warehouse=warehouse;
}
public void run() {
while(true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//1.从仓库取出产品
try {
Sem.ProductSum.acquire();//P(ProductSum)
Sem.CMUTEX.acquire();//P(CMUTEX)
} catch (InterruptedException e) {
e.printStackTrace();
}
int data = warehouse.get();
Sem.CMUTEX.release();//V(CMUTEX)
Sem.Capacity.release();//V(Capacity)
//2.产品消费
//do something to consume;
}
}
}