JUC - Semaphore实现生产者消费者

JUC - Semaphore实现生产者消费者

public class Q {


    int n;
    static Semaphore semCon = new Semaphore(0);
    static Semaphore semProd = new Semaphore(1);


    public void put(int n){
        try {
            semProd.acquire();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        this.n = n;
        System.out.println("put: "+ n);
        semCon.release();
    }

    public void get(){
        try {
            semCon.acquire();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("get: "+ n);
        semProd.release();
    }

    static class Producer implements Runnable{

        int n;
        Q q;

        public Producer(int n, Q q) {
            this.n = n;
            this.q = q;
        }

        @Override
        public void run() {
            for (int i = 0; i < n; i++) {
                q.put(i);
            }
        }
    }

    static class Consumer implements Runnable{

        int n;
        Q q;

        public Consumer(int n, Q q) {
            this.n = n;
            this.q = q;
        }

        @Override
        public void run() {
            for (int i = 0; i < n; i++) {
                q.get();
            }
        }
    }

    public static void main(String[] args) {
        Q q = new Q();
        new Thread(new Consumer(20,q),"Consumer").start();
        new Thread(new Producer(20,q),"Producer").start();
    }

}

运行结果:

put: 0
get: 0
put: 1
get: 1
put: 2
get: 2
put: 3
get: 3
put: 4
get: 4
put: 5
get: 5
put: 6
get: 6
put: 7
get: 7
put: 8
get: 8
put: 9
get: 9
put: 10
get: 10
put: 11
get: 11
put: 12
get: 12
put: 13
get: 13
put: 14
get: 14
put: 15
get: 15
put: 16
get: 16
put: 17
get: 17
put: 18
get: 18
put: 19
get: 19
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值