使用Condition实现多路等待通知
程序员文章站
2024-01-07 23:12:52
...
一个锁内部可以有多个Condition,即有多路等待和通知,可参考JDK1.5的Lock和Condition实现的可阻塞队列的应用案例,在传统的线程机制中一个监视器对象上只能有一路等待和通知,要想实现多路等待和通知,必须嵌套使用多个同步监视器对象.
使用Condition可简单实现多路等待通知
public class TwoConditionCommunication {
public static void main(String[] args) {
final Business business = new Business();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 1; i <= 50; i++) {
business.sub(i);
}
}
}).start();
for (int i = 1; i <= 50; i++) {
business.main(i);
}
}
static class Business {
Lock lock = new ReentrantLock();
Condition condition_sub = lock.newCondition();
Condition condition_main = lock.newCondition();
private boolean shouldSub = true;
public void sub(int i) {
lock.lock();
try {
while (!shouldSub) {
try {
condition_sub.await();
} catch (Exception e) {
e.printStackTrace();
}
}
for (int j = 1; j <= 10; j++) {
System.out.println("sub2 thread sequence of " + j
+ ",loop of " + i);
}
shouldSub = false;
condition_main.signal();
} finally {
lock.unlock();
}
}
public void main(int i) {
lock.lock();
try {
while (shouldSub) {
try {
condition_main.await();
} catch (Exception e) {
e.printStackTrace();
}
}
for (int j = 1; j <= 20; j++) {
System.out.println("main thread sequence of " + j
+ ",loop of " + i);
}
shouldSub = true;
condition_sub.signal();
} finally {
lock.unlock();
}
}
}
}
附JDK1.5中Demo
class BoundedBuffer {
final Lock lock = new ReentrantLock();
final Condition notFull = lock.newCondition();
final Condition notEmpty = lock.newCondition();
final Object[] items = new Object[100];
int putptr, takeptr, count;
public void put(Object x) throws InterruptedException {
lock.lock();
try {
while (count == items.length)
notFull.await();
items[putptr] = x;
if (++putptr == items.length) putptr = 0;
++count;
notEmpty.signal();
} finally {
lock.unlock();
}
}
public Object take() throws InterruptedException {
lock.lock();
try {
while (count == 0)
notEmpty.await();
Object x = items[takeptr];
if (++takeptr == items.length) takeptr = 0;
--count;
notFull.signal();
return x;
} finally {
lock.unlock();
}
}
}
推荐阅读
-
使用Condition实现多路等待通知
-
加入切面环绕通知实现,日志比较完善的使用方式
-
Android 使用AlarmManager和NotificationManager来实现闹钟和通知栏
-
Android不使用自定义布局情况下实现自定义通知栏图标的方法
-
Android不使用自定义布局情况下实现自定义通知栏图标的方法
-
Python多线程编程(七):使用Condition实现复杂同步
-
C#实现如何使用短信平台自动通知用户实例
-
ReentrantLock等待通知机制Condition介绍
-
Shell脚本实现硬盘空间和表空间的使用情况统计并邮件通知
-
详解Condition的await和signal等待/通知机制