一道多线程间的通信的面试题
编写一个程序,开启3个线程,这三个线程的ID分别为A、B、C,每个线程将自己的ID打印十次,要求输出结果按顺序显示,如:ABCABCABCABC....,依次递归。
- 写一个打印的类
class Print {
private int number = 1; //标识
private Lock lock = new ReentrantLock();
private Condition condition1 = lock.newCondition();
private Condition condition2 = lock.newCondition();
private Condition condition3 = lock.newCondition();
/**
* 打印A
*/
public void pointA(){
lock.lock();
try {
// 判断
if (number != 1){
condition1.await();
}
//打印
System.out.print(Thread.currentThread().getName());
//唤醒
number = 2;
condition2.signal();
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
}
/**
* 打印B
*/
public void pointB(){
lock.lock();
try {
// 判断
if (number != 2){
condition2.await();
}
//打印
System.out.print(Thread.currentThread().getName());
//唤醒
number = 3;
condition3.signal();
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
}
/**
* 打印C
*/
public void pointC(){
lock.lock();
try {
// 判断
if (number != 3){
condition3.await();
}
//打印
System.out.print(Thread.currentThread().getName()+"\t");
//唤醒
number = 1;
condition1.signal();
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
}
}
public static void main(String[] args) {
Print print = new Print();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 1; i <= 10; i++) {
print.pointA();
}
}
},"A").start();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 1; i <= 10; i++) {
print.pointB();
}
}
},"B").start();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 1; i <= 10; i++) {
print.pointC();
}
}
},"C").start();
}
}