多线程之编程面试题
来源:互联网 发布:网络机顶盒那个牌子的好 编辑:程序博客网 时间: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..
阅读全文
0 0
- 多线程之编程面试题
- 多线程编程之三个面试题
- 多线程编程面试题
- 多线程编程面试题1
- 多线程编程面试题2
- 多线程编程面试题3
- 多线程之--google面试题
- java面试题之------多线程
- 多线程编程4-------面试题增加信号
- 多线程编程4---面试题解法3
- 多线程编程10.1-----Condition解决面试题
- Android 面试题之编程
- java面试题解惑 之 多线程
- iOS 面试题之什么是多线程?
- C++面试题之编程风格面试题
- C++面试题之编程实现
- php面试题之编程题 004
- 编程之美面试题1
- 解决ExecutionException: com.android.dex.DexException: Multiple dex files define XXX
- 机器学习教程之9-SVM的sklearn实现
- API知识-1
- Lua中的字符串函数库
- laravel 实现上传
- 多线程之编程面试题
- 写好的验证界面(四位数数据随机组合)
- shell相关命令(一)
- C++中关于无法无法解析外部错误的解决方案
- spring整合activemq
- SpringMVC拦截器配置详解
- android中ViewPager+Picasso 实现轮播本地和网络图片源码
- 1.3概念和术语
- struts2中的常用s标签应用