Java并发之条件阻塞并发之条件阻塞Condition的应用代码示例的应用代码示例
主要介绍了Java并发之条件阻塞Condition的应用代码示例,分享了相关代码示例,小编觉得还是挺不错的,具
有一定借鉴价值,需要的朋友可以参考下
本文研究的主要是Java并发之条件阻塞Condition的应用示例代码,具体如下。
Condition将Object监视器方法(wait、notify 和 notifyAll)分解成截然不同的对象,以便通过将这些对象与任意Lock实现组合
使用,为每个对象提供多个等待 set(wait-set)。其中,Lock 替代了synchronized方法和语句的使用,Condition替代了
Object监视器方法的使用。
1. Condition的基本使用的基本使用
由于Condition可以用来替代wait、notify等方法,所以可以对比着之前写过的线程间通信的代码来看,再来看一下原来那
个问题:
有两个线程,子线程先执行10次,然后主线程执行5次,然后再切换到子线程执行10,再主线程执行5次……如此
往返执行50次。
之前用wait和notify来实现的,现在用Condition来改写一下,代码如下:
public class ConditionCommunication {
public static void main(String[] args) {
Business bussiness = new Business();
new Thread(new Runnable() {
// 开启一个子线程
@Override
public void run() {
for (int i = 1; i <= 50; i++) {
bussiness.sub(i);
}
}
}
).start();
// main方法主线程
for (int i = 1; i <= 50; i++) {
bussiness.main(i);
}
}
}
class Business {
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
//Condition是在具体的lock之上的
private Boolean bShouldSub = true;
public void sub(int i) {
lock.lock();
try {
while (!bShouldSub) {
try {
condition.await();
//用condition来调用await方法
}
catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
for (int j = 1; j <= 10; j++) {
System.out.println("sub thread sequence of " + j
+ ", loop of " + i);
}
bShouldSub = false;
condition.signal();
//用condition来发出唤醒信号,唤醒某一个
}
finally {
lock.unlock();
}
}
public void main(int i) {
lock.lock();
try {
while (bShouldSub) {
try {
condition.await();