这里的原理类似链表。
记录下一个的执行 flag
,只有 flag
相同的时候,才会执行。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| package com.redisc;
import lombok.extern.slf4j.Slf4j;
@Slf4j(topic = "c.Run") public class Run {
public static void main(String[] args) throws Exception {
WaitNotify wn = new WaitNotify(1, 5);
new Thread(() -> { wn.print("a", 1, 2); }).start(); new Thread(() -> { wn.print("b", 2, 3); }).start(); new Thread(() -> { wn.print("c", 3, 1); }).start(); }
}
class WaitNotify {
private int flag; private int loopNumber;
public WaitNotify(int flag, int loopNumber) { this.flag = flag; this.loopNumber = loopNumber; }
public void print(String str, int waitFlag, int nextFlag) { for (int i = 0; i < loopNumber; i++) { synchronized (this) { while (flag != waitFlag) { try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(str); flag = nextFlag; this.notifyAll(); } } } }
|
输出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| a b c a b c a b c a b c a b c
|