java生产者消费者

public class ProviderConsumer {
    private static final int MAX_CAPACITY = 16;
    private static Lock lock = new ReentrantLock();
    private static Condition full = lock.newCondition();
    private static Condition empty = lock.newCondition();
    private static AtomicInteger integer = new AtomicInteger();
    private static Queue<Integer> queue = new LinkedBlockingQueue<>(MAX_CAPACITY);

    static class Provider implements Runnable {
        @Override
        public void run() {
            for (; ; ) {
                lock.lock();
                try {
                    while (queue.size() == MAX_CAPACITY) {
                        System.out.println(Thread.currentThread().getName());
                        System.out.println("full");
//                        lock.unlock();// 这儿解锁相当于阻塞
                        full.await();
                    }
                    int i = integer.incrementAndGet();
                    queue.add(i);
                    System.out.println("provided:" + i);
                    Thread.sleep(50L);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    empty.signal();
                    lock.unlock();// 这儿解锁相当于让线程自己抢锁
                }
            }
        }
    }

    static class Consumer implements Runnable {
        @Override
        public void run() {
            for (; ; ) {
                lock.lock();
                try {
                    while (queue.size() == 0) {
                        System.out.println(Thread.currentThread().getName());
                        System.out.println("empty");
//                        lock.unlock();// 这儿解锁相当于阻塞
                        empty.await();
                    }
                    int i = integer.getAndDecrement();
                    queue.remove(i);
                    System.out.println("consumed:" + i);
                    Thread.sleep(500L);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    full.signal();
                    lock.unlock();// 这儿解锁相当于让线程自己抢锁
                }
            }
        }

    }

    public static void main(String[] args) {
        long alive = 60L;
        ThreadPoolExecutor executor = new ThreadPoolExecutor(MAX_CAPACITY, 
        MAX_CAPACITY, alive, TimeUnit.SECONDS, new LinkedBlockingDeque<>());

		Provider provider = new Provider();
        Consumer consumer = new Consumer();
        executor.execute(provider);
        executor.execute(consumer);
//        new Thread(provider).start();
//        new Thread(consumer).start();
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值