多线程之编程面试题

来源:互联网 发布:网络机顶盒那个牌子的好 编辑:程序博客网 时间:2024/05/16 08:06

网上看到一个关于多线程的面试编程题,要求如下:
开启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..