Condition是个接口,基本的方法就是await()和signal()方法;
Condition依赖于Lock接口,生成一个Condition的基本代码是lock.newCondition()
调用Condition的await()和signal()方法,都必须在lock保护之内,就是说必须在lock.lock()和lock.unlock之间才可以使用
Conditon中的await()对应Object的wait();
Condition中的signal()对应Object的notify();
Condition中的signalAll()对应Object的notifyAll()。
实例: 相对于 Object 中的方法 控制粒度 更细。
public class ThreeConditionCommunication {
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.sub1(i);
}
}
}).start();
new Thread(new Runnable() {// 开启另一个子线程
@Override
public void run() {
for (int i = 1; i <= 50; i++) {
bussiness.sub2(i);
}
}
}).start();
// main方法主线程
for (int i = 1; i <= 50; i++) {
bussiness.main(i);
}
}
static class Business {
Lock lock = new ReentrantLock(); //是一种 排他锁
Condition condition1 = lock.newCondition(); //Condition是在具体的lock之上的
Condition condition2 = lock.newCondition();
Condition conditionMain = lock.newCondition();
private int bShouldSub = 0;
public void sub1(int i) {
lock.lock();
try {
while (bShouldSub != 0) {
try {
condition1.await(); //用condition来调用await方法
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
for (int j = 1; j <= 10; j++) {
System.out.println("sub1 thread sequence of " + j
+ ", loop of " + i);
}
bShouldSub = 1;
condition2.signal(); //让线程2执行
} finally {
lock.unlock();
}
}
public void sub2(int i) {
lock.lock();
try {
while (bShouldSub != 1) {
try {
condition2.await(); //用condition来调用await方法
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
for (int j = 1; j <= 10; j++) {
System.out.println("sub2 thread sequence of " + j
+ ", loop of " + i);
}
bShouldSub = 2;
conditionMain.signal(); //让主线程执行
} finally {
lock.unlock();
}
}
public void main(int i) {
lock.lock();
try {
while (bShouldSub != 2) {
try {
conditionMain.await(); //用condition来调用await方法
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
for (int j = 1; j <= 5; j++) {
System.out.println("main thread sequence of " + j
+ ", loop of " + i);
}
bShouldSub = 0;
condition1.signal(); //让线程1执行
} finally {
lock.unlock();
}
}
}
}