手动实现线程池之手动实现阻塞队列

65 阅读1分钟
class Blockingqueue<T> {
    int capity;

    public Blockingqueue(int capity) {
        this.capity = capity;
    }

    // 生产者线程要往里面添加内容,消费者线程要取出内容。
    ReentrantLock lock = new ReentrantLock();
    Condition productRoom = lock.newCondition();
    Condition consumerRoom = lock.newCondition();

    Queue<T> blockingQueue = new ArrayDeque<>();

    public void put(T t) {
        lock.lock();
        try {
            while (this.capity == blockingQueue.size()) {
                productRoom.await();
            }
            blockingQueue.add(t);
            consumerRoom.signalAll();
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        } finally {
            lock.unlock();
        }
    }

    public T get() throws InterruptedException {
        lock.lock();
        try {
            while (blockingQueue.isEmpty()) {
                consumerRoom.await();
            }

            T t = blockingQueue.remove();
            productRoom.signalAll();
            return t;
        } finally {
            lock.unlock();
        }

    }


}

这一块儿没啥难度,主要是会生产者消费者模型就行