网上看到一个关于多线程的面试编程题,要求如下:
开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。
这里先介绍下:ReentrantLock的作用
http://blog.csdn.net/yanyan19880509/article/details/52345422
思路如下:
public class TestThread {
public void init(){
PrintTest printTest=new PrintTest();
new Thread(new Runnable() {
@Override
public void run() {
for (int i=0;i<10;i++){
printTest.printA();
}
}
},"A").start();
new Thread(new Runnable() {
@Override
public void run() {
for (int i=0;i<10;i++){
printTest.printB();
}
}
},"B").start();
new Thread(new Runnable() {
@Override
public void run() {
for (int i=0;i<10;i++){
printTest.printC();
}
}
},"C").start();
}
public static void main(String[] args) throws InterruptedException {
TestThread testThread=new TestThread();
testThread.init();
}
}
public class PrintTest {
//定义一个可重入锁(自己可以获得自己的内部锁),当线程A执行完一次后,下次可以再次获取锁
private Lock lock=new ReentrantLock();
//定义执行线程的一个标记
private String flag="A";
//创建三个临时的condition连接对象
private Condition conditionA=lock.newCondition();
private Condition conditionB=lock.newCondition();
private Condition conditionC=lock.newCondition();
public void printA(){
try {
lock.lock();
if (!flag.equals("A")){
conditionA.await();
}
System.out.print(Thread.currentThread().getName());
Thread.sleep(10);
flag="B";
conditionB.signal();
}catch (Exception e){
}finally {
lock.unlock();
}
}
public void printB(){
try {
lock.lock();
if (!flag.equals("B")){
conditionB.await();
}
System.out.print(Thread.currentThread().getName());
Thread.sleep(10);
flag="C";
conditionC.signal();
}catch (Exception e){
}finally {
lock.unlock();
}
}
public void printC(){
try {
lock.lock();
if (!flag.equals("C")){
conditionC.await();
}
System.out.print(Thread.currentThread().getName()+"..");
Thread.sleep(10);
flag="A";
conditionA.signal();
}catch (Exception e){
}finally {
lock.unlock();
}
}
}
执行TestThread结果如下:
ABC..ABC..ABC..ABC..ABC..ABC..ABC..ABC..ABC..ABC..