目录
(ReentrantLock)await & signal方式
synchronized方式
package com.atguigu.juc;
public class ChangePrint {
public static void main(String[] args) {
WaitChange waitChange = new WaitChange(1, 5);
new Thread(()->{
waitChange.print("a",1,2);
}).start();
new Thread(()->{
waitChange.print("b",2,3);
}).start();
new Thread(()->{
waitChange.print("c",3,1);
}).start();
}
}
class WaitChange {
private int flag;
private int loopNumber;
public WaitChange(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.print(str+" ");
flag = nextFlag;
this.notifyAll();
}
}
}
}
(ReentrantLock)await & signal方式
package com.atguigu.juc;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.LockSupport;
public class ChangePrintLockSupport {
static Thread t1;
static Thread t2;
static Thread t3;
public static void main(String[] args) {
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();
LockSupport.unpark(t1);
}
}
class ParkUnpark {
private int loopNumber;
public ParkUnpark(int loopNumber) {
this.loopNumber = loopNumber;
}
public void print(String cur,Thread next){
for (int i = 0; i < loopNumber; i++) {
LockSupport.park();
System.out.println(cur);
LockSupport.unpark(next);
}
}
}
(LockSupport)park&unpark方式
package com.atguigu.juc;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
public class ChangePrintReentrantLock {
public static void main(String[] args) throws InterruptedException {
ChangeReentrantLock reentrantLock = new ChangeReentrantLock(5);
Condition c1 = reentrantLock.newCondition();
Condition c2 = reentrantLock.newCondition();
Condition c3 = reentrantLock.newCondition();
new Thread(()->{
reentrantLock.print("a",c1,c2);
}).start();
new Thread(()->{
reentrantLock.print("b",c2,c3);
}).start();
new Thread(()->{
reentrantLock.print("c",c3,c1);
}).start();
Thread.sleep(1000);
reentrantLock.lock();
try {
System.out.println("开始");
c1.signal();
} finally {
reentrantLock.unlock();
}
}
}
class ChangeReentrantLock extends ReentrantLock {
private int loopNumber;
public ChangeReentrantLock(int loopNumber) {
this.loopNumber = loopNumber;
}
public void print(String str, Condition curCondition,Condition nextCondition){
for (int i = 0; i < loopNumber; i++) {
lock();
try {
try {
curCondition.await();
System.out.println(str);
nextCondition.signal();
} catch (InterruptedException e) {
e.printStackTrace();
}
} finally {
unlock();
}
}
}
}