Java三个线程循环打印ABC。。。,是个笔试题,主要学习掌握线程同步,需要有线程基础知识。
思路:通过synchronized关键词锁定两个对象保持线程同步,只有同时获取上一个对象和自身锁才运行来保证依次打印ABC,当前线程运行完使用wait释放自身锁并使用modify唤醒上一个对象锁。
A->AC,B->BA,C-CA锁关系,A同时满足获取AC锁执行打印后处理线程状态wait->A并notify->C,B满足AB锁才会运行所以只有当A运行完并wait释放B才会运行再依次wait->B并notify->A,C也是依次执行。
定义一个线程执行主体
/**
* Created by litf on 2017/5/4.
*/
public class RunnableAbcTwo implements Runnable{
private Object prev;
private Object self;
private String name;
private int sum= 0;
public RunnableAbcTwo(Object self,Object prev,String name){
this.prev = prev;
this.name = name;
this.self = self;
}
@Override
public void run() {
while(true){
// System.out.println("wh--"+name);
synchronized (self){
//System.out.println("prev--"+name);
synchronized (prev){
System.out.println(name);
prev.notify();
//System.out.println("wait--"+name);
}
try {
self.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
sum++;
if(sum >=10){
break;
}
}
}
}
调用打印ABC
/**
* Created by litf on 2017/5/4.
*/
public class RunableTestTwo {
public static void main(String args[])throws Exception{
Object A = new Object();
Object B = new Object();
Object C = new Object();
Thread t1 = new Thread (new RunnableAbcTwo(A, B, "A"));
Thread t2 = new Thread (new RunnableAbcTwo(B, C, "B"));
Thread t3 = new Thread (new RunnableAbcTwo(C, A, "C"));
t1.start();
t2.start();
t3.start();
}
}
打印结果:
```java
A
B
C
A
B
C
A
B
C
A
B
C
A
B
C
A
B
C
A
B
C
A
B
C
A
B
C
A
B
C