Java多线程基础知识(四)
一. Condition 接口
1. Condition接口也提供了类似Object的监视器方法,与Lock配合可以实现等待/通知模式。 但是这两者在使用方式以及功能特性上还是有差别的。
2. 支持多个等待队列个数
3. 支持当前线程施放锁并进入等待状态
4. 支持当前线程施放锁并进入等待状态,在等待状态中不响应中断
5. 支持当前线程施放锁并进入超时等待状态
6. 支持当前线程施放锁并进入等待状态到将来的某个时间
7. 支持唤醒等待队列中的一个线程
8. 支持唤醒等待队列中的全部线程
package com.dcz.juc; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; public class BoundedQueue<T> { private Object[] items; // 添加的下标,删除的下标和数组当前数量 private int addIndex, removeIndex, count; // 重入锁 private Lock lock = new ReentrantLock(); // 空 private Condition notEmpty = lock.newCondition(); // 满 private Condition notFull = lock.newCondition(); // 初始化队列大小 public BoundedQueue(int size) { items = new Object[size]; } // 添加一个元素,如果数组满,则添加线程进入等待状态,直到有空位 public void add(T t) throws InterruptedException { lock.lock(); try { while (count == items.length) { // 数组满,进入等待状态 notFull.await(); // 入队 items[addIndex] = t; if (++addIndex == items.length) { addIndex = 0; } ++count; notEmpty.signal(); } } finally { lock.unlock(); } } // 由头部删除一个元素,如果数组空,则删除线程进入等待状态,直到有新添加元素 public T remove() throws InterruptedException { lock.lock(); try { while(count == 0){ notEmpty.await(); Object o = items[removeIndex]; if(++removeIndex == items.length){ removeIndex = 0; } --count; notFull.signal(); return (T)o; } } finally { lock.unlock(); } return null; } }