您的位置:首页 > 编程语言 > Java开发

Java多线程基础知识(四)

2015-09-24 22:30 716 查看
一. 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;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: