采用synchronized,wait,notifyAll实现,要实现这个功能,如Thread A >>A ,Thread B>>B,Thread C >>C,按顺序执行,那么我们需要让线程持有两个锁,一个是前一个打印线程对应的锁,一个是自己的锁,当线程同时获取到两个锁时,可以执行打印,打印结束后,释放自己的锁并唤醒其他等待该锁的线程,同时调用wait释放前一个打印线程的锁并阻塞直到下一次再得到该锁,然后继续打印。
public class TestThread implements Runnable{
private String name;
//前一个打印线程的锁
private Object pre;
//自己的锁
private Object self;
public TestThread(String name,Object pre,Object self) {
this.name = name;
this.pre = pre;
this.self = self;
}
public void run() {
//循环打印五次ABC
int count = 5;
while(count>0){
synchronized (pre) {
synchronized (self) {
System.out.println(name);
count--;
self.notifyAll();
}
try {
pre.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
Object a = new Object();
Object b = new Object();
Object c = new Object();
//确保锁的顺序
//当A执行完毕,释放a锁,唤醒等待a的B线程,并且会阻塞等待c这个锁
//B同理
TestThread A = new TestThread("A", c, a);
TestThread B = new TestThread("B", a, b);
TestThread C = new TestThread("C", b, c);
//确保ABC的启动顺序
new Thread(A).start();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
new Thread(B).start();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
new Thread(C).start();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
执行结果