我们知道在线程的同步时可以使一个线程阻塞而等待一个信号,同时放弃锁使其他线程可以能竞争到锁。在synchronized中我们可以使用Object的wait()和notify方法实现这种等待和唤醒,但是在Lock中怎么实现这种wait和notify呢?答案是Condition
前面用等待唤醒的方式实现了a调用10次b调用20次,a调用10次b调用20次 重复50次。那么a 调用10次 b调用20次 c 调用30次 ,a 调用10次 b调用20次 c 调用30次 重复50次怎么实现呢。
public class Business {
Lock lock=new ReentrantLock();
Condition condition1=lock.newCondition();
Condition condition2 =lock.newCondition();
Condition condition3 =lock.newCondition();
private int bShouldSub=1;
public void sub1(int i){
lock.lock();
try {
while (bShouldSub!=1){
try {
condition1.await();
} catch (Exception e) {
e.printStackTrace();
}
}
for (int j=1;j<=5;j++){
System.out.println("sub1 sequece "+i+" loop for "+j);
}
bShouldSub=2;
condition2.signal();
}finally {
lock.unlock();
}
}
public void sub2(int i) {
lock.lock();
try {
while (bShouldSub!=2) {
try {
// this.wait();
condition2.await();
} catch (Exception e) {
e.printStackTrace();
}
}
for (int j = 1; j <= 20; j++) {
System.out.println("main sequece " + i + " loop for " + j);
}
bShouldSub=3;
condition3.signal();
}finally {
lock.unlock();
}
}
public void sub3(int i){
lock.lock();
try {
while (bShouldSub!=3){
try {
condition3.await();
} catch (Exception e) {
e.printStackTrace();
}
}
for (int j=1;j<=30;j++){
System.out.println("sub3 sequece "+i+" loop for "+j);
}
bShouldSub=1;
condition1.signal();
}finally {
lock.unlock();
}
}
}
主函数这里写代码片
public class Main {
public static void main(String[] args){
final Business bs=new Business();
new Thread(new Runnable() {
public void run() {
for (int i=1;i<=50;i++){
bs.sub1(i);
}
}
}).start();
new Thread(new Runnable() {
public void run() {
for (int i=1;i<=50;i++){
bs.sub2(i);
}
}
}).start();
new Thread(new Runnable() {
public void run() {
for (int i=1;i<=50;i++){
bs.sub3(i);
}
}
}).start();
}
}
文章地址:http://www.haha174.top/article/details/255553
源码地址:https://github/haha174/thread-learning.git
更多推荐
多线程和并发库应用十二--Condition
发布评论