《黑马程序员》Lock&Condition练习

来源:互联网 发布:linux rpm 安装文件 编辑:程序博客网 时间:2024/05/18 14:43
public class ConditionCommuncationTest3 {/** *  子线程循环10次,接着主线程循环100,接着又回到子线程循环10次, *  接着再回到主线程又循环100,如此循环50次,请写出程序。 * 假设我们这里有三个线程。即两个子线程一个主线程 */public static void main(String[] args) {final Business busi = new Business();// 子线程new Thread(new Runnable() {@Overridepublic void run() {for (int i = 1; i <= 50; i++) {busi.sub(i); // 调用相关联的类身上的方法}}}).start();new Thread(new Runnable() {@Overridepublic 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();}}}}

0 0
原创粉丝点击