

package cn.meowrain;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class WaitNotify {
private int loopNumber;
private int flag;
public WaitNotify(int loopNumber, int flag) {
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 (waitFlag != flag) {
try{
this.wait();
}catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.print(str);
flag = nextFlag;
this.notifyAll();
}
}
}
public static void main(String[] args) {
WaitNotify waitNotify = new WaitNotify(5,1);
new Thread(()->{
waitNotify.print("a",1,2);
}).start();
new Thread(()->{
waitNotify.print("b",2,3);
}).start();
new Thread(()->{
waitNotify.print("c",3,1);
}).start();
}
}
package cn.meowrain;
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
@Slf4j
public class AwaitSignal extends ReentrantLock {
private int loopNumber;
public AwaitSignal(int loopNumber) {
this.loopNumber = loopNumber;
}
public void print(String str, Condition thisCondition, Condition nextCondition) {
for (int i = 0; i < loopNumber; i++) {
try {
lock();
thisCondition.await();
System.out.print(str);
nextCondition.signal();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
unlock();
}
}
}
}
class Tests {
public static void main(String[] args) {
AwaitSignal signal = new AwaitSignal(5);
Condition a = signal.newCondition();
Condition b = signal.newCondition();
Condition c = signal.newCondition();
new Thread(() -> signal.print("a", a, b)).start();
new Thread(() -> signal.print("b", b, c)).start();
new Thread(() -> signal.print("c", c, a)).start();
try {
TimeUnit.SECONDS.sleep(1);
signal.lock();
a.signal();
} catch (InterruptedException e) {
throw new RuntimeException(e);
} finally {
signal.unlock();
}
}
}
package cn.meowrain;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.LockSupport;
public class ParkUnPark {
private final int loopNumber;
public ParkUnPark(int loopNumber) {
this.loopNumber = loopNumber;
}
public void print(String str,Thread next) {
for (int i = 0; i < loopNumber; i++) {
LockSupport.park();
System.out.print(str);
LockSupport.unpark(next);
}
}
}
class Tests2 {
static Thread t1;
static Thread t2;
static Thread t3;
public static void main(String[] args) throws InterruptedException {
ParkUnPark parkUnPark = new ParkUnPark(5);
t1 = new Thread(() -> parkUnPark.print("a", t2));
t2 = new Thread(() -> parkUnPark.print("b", t3));
t3 = new Thread(() -> parkUnPark.print("c", t1));
t1.start();
t2.start();
t3.start();
TimeUnit.SECONDS.sleep(1);
LockSupport.unpark(t1);
}
}