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;
	}

}



 

posted @ 2015-09-24 22:30  dcz1001  阅读(241)  评论(0编辑  收藏  举报