Java NIO - Condition
2016-04-10 18:01
351 查看
Condition用来实现对应Object的wati,notify,notifyAll三个方法。
在Condition中用await()替换wait(),用signal()替换notify() ,用signalAll()替换notifyAll(),传统线程之间的通讯Condition都可以实现。如下列子,我们实现一个读写操作,分为读写线程。
参考:http://blog.csdn.net/ghsau/article/details/7481142
在Condition中用await()替换wait(),用signal()替换notify() ,用signalAll()替换notifyAll(),传统线程之间的通讯Condition都可以实现。如下列子,我们实现一个读写操作,分为读写线程。
package chp3.condition;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class BufferThread {
final Lock lock = new ReentrantLock();// 锁
final Condition notFull = lock.newCondition();// 写线程条件
final Condition notEmpty = lock.newCondition();// 读线程条件
final Object[] items = new Object[10];// 缓存队列
int putptr/* 写索引 */, takeptr/* 读索引 */, count/* 队列中存在的数据个数 */;
public void put(Object x) throws InterruptedException {
lock.lock();
try {
while (count == items.length) {
notFull.await();// 阻塞写线程
}
System.out.println("写入操作: index = " + putptr + " value = " + x);
items[putptr++] = x;
if (putptr == items.length)
putptr = 0;// 如果写索引写到队列的最后一个位置了,那么置为0
++count;// 个数++
notEmpty.signal();// 唤醒读线程
} finally {
lock.unlock();
}
}
public Object take() throws InterruptedException {
lock.lock();
try {
while (count == 0)
// 如果队列为空
notEmpty.await();// 阻塞读线程
Object x = items[takeptr];// 取值
System.out.println("读取操作: index =" + takeptr + " vale = " + x);
if (++takeptr == items.length)
takeptr = 0;// 如果读索引读到队列的最后一个位置了,那么置为0
--count;// 个数--
notFull.signal();// 唤醒写线程
return x;
} finally {
lock.unlock();
}
}
public static void main(String[] args) {
final BufferThread bt = new BufferThread();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 250; i++)
try {
bt.put(i);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 230; i++)
try {
bt.take();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
t1.start();
t2.start();
}
}
参考:http://blog.csdn.net/ghsau/article/details/7481142
相关文章推荐
- Java中@Override的作用
- Java中@Override的作用
- 20145327高晨 实验一 "Java开发环境的熟悉"
- 关于java“配置环境变量”的那些事
- JAVA实验一20145315
- 关于Spring事务回滚的配置及使用
- Java泛型的理解
- Java调用ICTCLAS2016 之中文分词
- Java中通过反射获取类的信息(方法名,参数,构造函数等)
- 20145233韩昊辰 《Java程序设计》实验报告一:Java开发环境的熟悉(Windows+IDEA)
- 20145304 Java第六周学习报告
- spring security:第一个程序
- 20145326 《Java程序设计》实验一实验报告
- 《Java程序设计》第6周学习总结
- 20145227《Java程序设计》第1次实验报告
- java递归获取某个父节点下面的所有子节点
- Struts2类型转换
- SpringMVC教程(一)框架搭建
- 解决springMVC POST 中文乱码
- 严重: Dispatcher initialization failed java.lang.RuntimeException: java.lang.reflect.InvocationTargetE