比如
A线程输出1,
B线程输出2,
C线程输出3,
A线程输出4,
B线程输出5,
C线程输出6
……
我们可以用synchronized和wait和notify来实现,要实现顺序执行,那么下一个线程的开始应该是上一个线程给的信号,这样才能保证顺序执行,代码如下
public static void main(String[] args) throws InterruptedException {
Object lockA = new Object();
Object lockB = new Object();
Object lockC = new Object();
ThreadA threadA = new ThreadA("ThreadA", lockC, lockA);
ThreadB threadB = new ThreadB("ThreadB", lockA, lockB);
ThreadC threadC = new ThreadC("ThreadC", lockB, lockC);
threadA.start();
Thread.sleep(10);
threadB.start();
Thread.sleep(10);
threadC.start();
}
public class ThreadA extends Thread {
private Object lockC;
private Object lockA;
public ThreadA(String name, Object lockC, Object lockA) {
super(name);
this.lockC = lockC;
this.lockA = lockA;
}
@Override
public void run() {
for (int i = 1; i <= 100; i += 3) {
synchronized (lockC) {
synchronized (lockA) {
System.out.println("A" + i);
lockA.notify();
}
try {
if(i != 100){
lockC.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
public class ThreadB extends Thread {
private Object lockA;
private Object lockB;
public ThreadB(String name, Object lockA, Object lockB) {
super(name);
this.lockA = lockA;
this.lockB = lockB;
}
@Override
public void run() {
for (int i = 2; i <= 100; i += 3) {
synchronized (lockA) {
synchronized (lockB) {
System.out.println("B" + i);
lockB.notify();
}
try {
if(i != 98){
lockA.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
public class ThreadC extends Thread {
private Object lockB;
private Object lockC;
public ThreadC(String name, Object lockB, Object lockC) {
super(name);
this.lockB = lockB;
this.lockC = lockC;
}
@Override
public void run() {
for (int i = 3; i <= 100; i += 3) {
synchronized (lockB) {
synchronized (lockC) {
System.out.println("C" + i);
lockC.notify();
}
try {
if(i != 99){
lockB.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
测试输出结果:
A1
B2
C3
A4
B5
C6
A7
B8
C9
A10
B11
C12
A13
B14
C15
A16
B17
C18
A19
B20
C21
A22
B23
C24
A25
B26
C27
A28
B29
C30
A31
B32
C33
A34
B35
C36
A37
B38
C39
A40
B41
C42
A43
B44
C45
A46
B47
C48
A49
B50
C51
A52
B53
C54
A55
B56
C57
A58
B59
C60
A61
B62
C63
A64
B65
C66
A67
B68
C69
A70
B71
C72
A73
B74
C75
A76
B77
C78
A79
B80
C81
A82
B83
C84
A85
B86
C87
A88
B89
C90
A91
B92
C93
A94
B95
C96
A97
B98
C99
A100