学习视频资料地址:
https://www.bilibili.com/video/av59548640?p=1;
网盘资料地址:
链接:https://pan.baidu.com/s/1AdZsYnFcDPqrQzQ5BTBqEw 提取码:uvks
代码示例十:
package com.juchaosoft.test; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * 线程按序交替 * @author wang-xiaoming * */ public class TestAlternateABC10_01 { public static void main(String[] args) { AlternateDemo ad = new AlternateDemo(); // 三个线程同时开启,循环十次并按照线程规定顺序打印ABC new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 10; i++) { ad.loopA(i, 1); } } }, "A").start(); new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 10; i++) { ad.loopB(i, 2); } } }, "B").start(); new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 10; i++) { ad.loopC(i, 3); System.out.println("第" + (i + 1) + "次执行结束。。"); } } }, "C").start(); } } class AlternateDemo{ // 当前正在执行的线程的标记 private int number = 1; private Lock lock = new ReentrantLock(); private Condition condition1 = lock.newCondition(); private Condition condition2 = lock.newCondition(); private Condition condition3 = lock.newCondition(); public void loopA(int total, int times){ lock.lock(); try { // 1、判断线程 while(number != 1){ condition1.await(); } // 2、打印 for (int i = 0; i < times; i++) { System.out.println(Thread.currentThread().getName() + "\t" + i + "\t" + total); } // 3、结束,唤醒下一个线程 number = 2; condition2.signal(); } catch (Exception e) { Thread.currentThread().interrupt(); } finally { lock.unlock(); } } public void loopB(int total, int times){ lock.lock(); try { // 1、判断线程 while(number != 2){ condition2.await(); } // 2、打印 for (int i = 0; i < times; i++) { System.out.println(Thread.currentThread().getName() + "\t" + i + "\t" + total); } // 3、结束,唤醒下一个线程 number = 3; condition3.signal(); } catch (Exception e) { Thread.currentThread().interrupt(); } finally { lock.unlock(); } } public void loopC(int total, int times){ lock.lock(); try { // 1、判断线程 while(number != 3){ condition3.await(); } // 2、打印 for (int i = 0; i < times; i++) { System.out.println(Thread.currentThread().getName() + "\t" + i + "\t" + total); } // 3、结束,唤醒下一个线程 number = 1; condition1.signal(); } catch (Exception e) { Thread.currentThread().interrupt(); } finally { lock.unlock(); } } }
console:
A 0 0 B 0 0 B 1 0 C 0 0 C 1 0 C 2 0 第1次执行结束。。 A 0 1 B 0 1 B 1 1 C 0 1 C 1 1 C 2 1 第2次执行结束。。 A 0 2 B 0 2 B 1 2 C 0 2 C 1 2 C 2 2 第3次执行结束。。 A 0 3 B 0 3 B 1 3 C 0 3 C 1 3 C 2 3 第4次执行结束。。 A 0 4 B 0 4 B 1 4 C 0 4 C 1 4 C 2 4 第5次执行结束。。 A 0 5 B 0 5 B 1 5 C 0 5 C 1 5 C 2 5 第6次执行结束。。 A 0 6 B 0 6 B 1 6 C 0 6 C 1 6 C 2 6 第7次执行结束。。 A 0 7 B 0 7 B 1 7 C 0 7 C 1 7 C 2 7 第8次执行结束。。 A 0 8 B 0 8 B 1 8 C 0 8 C 1 8 C 2 8 第9次执行结束。。 A 0 9 B 0 9 B 1 9 C 0 9 C 1 9 C 2 9 第10次执行结束。。