基本思路:
基于java自带的信号量实现基本的有限缓冲区生产者消费者模式
代码如下:
package ConcurrentControl;
import java.util.concurrent.Semaphore;
/**
有限缓冲区的生产者消费者模式(简单模拟)
实现方式3
采用信号量实现
*/
public class Problem_03 {
private static final Semaphore full = new Semaphore(10);
private static final Semaphore empty = new Semaphore(0);
private static final Semaphore mutex = new Semaphore(1);
private static int availableSlotNum = 0;
public static void main(String argv[]){
new Thread(new Producer()).start();
new Thread(new Consumer()).start();
new Thread(new Producer()).start();
new Thread(new Consumer()).start();
new Thread(new Producer()).start();
new Thread(new Consumer()).start();
}
private static class Producer implements Runnable{
@Override
public void run() {
for(int i=0; i<10; i++){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
full.acquire();
mutex.acquire();
availableSlotNum++;
System.out.printf("********************\n");
System.out.printf("Producer:\n");
System.out.printf("\tThread Name -> " + Thread.currentThread().getName()+"\n");
System.out.printf("\tAvailableSlotNum -> " + availableSlotNum+"\n");
System.out.printf("********************\n");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
mutex.release();
empty.release();
}
}
}
}
private static class Consumer implements Runnable{
@Override
public void run() {
for(int i=0; i<10; i++){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
empty.acquire();
mutex.acquire();
availableSlotNum--;
System.out.printf("********************\n");
System.out.printf("Consumer:\n");
System.out.printf("\tThread Name -> " + Thread.currentThread().getName()+"\n");
System.out.printf("\tAvailableSlotNum -> " + availableSlotNum+"\n");
System.out.printf("********************\n");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
mutex.release();
full.release();
}
}
}
}
}