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;
}
}
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;
}
}
相关文章推荐
- Java覆盖和隐藏
- Callable和Future、FutureTask
- MyEclipse SVN 插件
- 转载老师的一篇文章——java自学之路
- 一个关于java数据库驱动包的小发现
- Java基础知识强化74:正则表达式之分割功能 (扩展练习)
- 用代码窥探Java支持的语言
- Java 基础总结
- Java学习日记-2 零零碎碎
- [转载]java servlet过滤器控制frame框架中的页面跳转
- Java基础知识强化73:正则表达式之分割功能
- Android 开发在Eclipse提示信息 This element neither has attached source nor attached Javadoc
- java基金会 之 HashMap统计csvWord文档
- java编程——数据的加法
- 简单springMVC环境搭建
- java字符转换
- Java基础知识强化72:正则表达式之判断功能(手机号码判断 和 校验邮箱)
- JAVA学习第三天
- eclipse 缓解眼睛疲劳保护眼睛
- Java笔试选择题 1