public class ConditionCommuncationTest3 {
/**
* 子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,
* 接着再回到主线程又循环100,如此循环50次,请写出程序。
* 假设我们这里有三个线程。即两个子线程一个主线程
*/
public static void main(String[] args) {
final Business busi = new Business();
// 子线程
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 1; i <= 50; i++) {
busi.sub(i); // 调用相关联的类身上的方法
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 1; i <= 50; i++) {
busi.sub2(i); // 调用相关联的类身上的方法
}
}
}).start();
// 主线程
for (int i = 1; i <= 50; i++) {
busi.main(i); // 调用相关联的类身上的方法
}
}
static class Business {
// 创建一个可重入的锁
private Lock lock = new ReentrantLock();
// Condition是基于Lock的
private Condition condition1 = lock.newCondition(); //通知第一个线程
private Condition condition2 = lock.newCondition(); //通知第二个线程
private Condition condition3 = lock.newCondition(); //通知第三个线程
private int shoudleExecute = 1; // 默认是主线程先执行任务
public void sub(int i) { /*2*/
lock.lock(); // 开启锁
try {
if (shoudleExecute != 2) {
try {
condition2.await(); // 通知当前的线程进入等待状态
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for (int j = 1; j <= 10; j++) {
System.out.println("sub thread sequence of:" + j
+ ",loop of:" + i);
}
shoudleExecute = 3;
condition3.signal(); // 激活处于等待的线程
} catch (Exception e) {
} finally {
lock.unlock(); // 释放锁
}
}
public void sub2(int i) { /*3*/
lock.lock(); // 开启锁
try {
if (shoudleExecute != 3) {
try {
condition3.await(); // 通知当前的线程进入等待状态
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for (int j = 1; j <= 10; j++) {
System.out.println("sub2 thread sequence of:" + j
+ ",loop of:" + i);
}
shoudleExecute = 1;
condition1.signal(); // 激活处于等待的线程
} catch (Exception e) {
} finally {
lock.unlock(); // 释放锁
}
}
public void main(int i) { /*1*/
lock.lock();
try {
if (shoudleExecute != 1) {
try {
// this.wait();
condition1.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for (int j = 1; j <= 100; j++) {
System.out.println("main thread sequence of:" + j
+ ",loop of:" + i);
}
shoudleExecute = 2;
condition2.signal();
} catch (Exception e) {
} finally {
lock.unlock();
}
}
}
}
《黑马程序员》Lock&Condition练习
最新推荐文章于 2022-07-29 17:46:38 发布