生产者消费者问题 -- 多生产者多消费者

257 阅读1分钟
class Resource1{
    int count = 0;
    final Semaphore put = new Semaphore(5);//初始令牌个数
    final Semaphore get = new Semaphore(0);
    final Semaphore mutex = new Semaphore(1);

    public void produce(){
        for (int i = 0; i < 5; i++) {
            try {
                put.acquire(1);//注意顺序
                mutex.acquire(1);
                count++;
                System.out.println(Thread.currentThread().getName() + "produce:: " + count);
            } catch (Exception e) {
                e.printStackTrace();
            }
            finally {
                mutex.release(1);
                get.release(1);
            }
        }

    }

    public void consume(){
        for (int i = 0; i < 5; i++) {
            try {
                get.acquire(1);//注意顺序。要是先获取mutex,后获取get,会造成死锁
                mutex.acquire(1);
                count--;
                System.out.println(Thread.currentThread().getName()+ "consume:: " + count);
            }catch (Exception e) {
                e.printStackTrace();
            } finally {
                mutex.release(1);
                put.release(1);
            }
        }

    }
}

class Main{
    public static void main(String[] args) throws InterruptedException {
        Resource1 resource = new Resource1();
        new Thread(()->{ resource.consume(); }).start();
        new Thread(()->{ resource.consume(); }).start();

        new Thread(()->{resource.produce();}).start();
        new Thread(()->{resource.produce();}).start();
    }
}