有三个线程分别打印A、B、C, 请用多线程编程实现,在屏幕上循环打印10次ABCABC…
这是一个比较常用的关于线程的考题,一般出现在应届生的校园招聘试卷上。
本文给出如下四种解决方法:
使用synchronized, wait和notifyAll
使用Lock 和 Condition
使用Semaphore
使用AtomicInteger
使用synchronized, wait和notifyAll
/**
* @author wangmengjun
*
*/
public class SyncObj {
private char letter = 'A';
public void nextLetter() {
switch (letter) {
case 'A':
letter = 'B';
break;
case 'B':
letter = 'C';
break;
case 'C':
letter = 'A';
break;
default:
break;
}
}
public char getLetter() {
return letter;
}
}
/**
* @author wangmengjun
*
*/
public class PrintLetterRunnable implements Runnable {
private SyncObj syncObj;
private char letter;
public PrintLetterRunnable(SyncObj syncObj, char letter) {
this.syncObj = syncObj;
this.letter = letter;
}
public void run() {
for (int i = 0; i < 10; i++) {
synchronized (syncObj) {
/**
* 如果当前线程的字符和同步对象的字符不一致,则当前线程一直等待
*/
while (letter != syncObj.getLetter()) {
try {
syncObj.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 输出当前线程的字符
*/
System.out.print(letter);
/**
* 改变同步对象的letter值
*/
syncObj.nextLetter();
/**
* 通知其它所有等待线程
*/
syncObj.notifyAll();
}
}
}
}
public class Main {
public static void