一道面试题:多个线程按顺序输出
来源:互联网 发布:淘宝玻璃砖 编辑:程序博客网 时间:2024/05/16 17:06
题目:编写一个程序,开启 3 个线程,这三个线程的 ID 分别为 A、B、C,每个线程将自己的 ID 在屏幕上打印 10 遍,要求输出的结果必须按顺序显示。如:ABCABCABC……
解题源码:
package concurrent;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;class AlternateDemo { //标志当前由哪一个线程输出,1代表A,2代表B,3代表C private int number = 1; Lock lock = new ReentrantLock(); //Condition的强大之处在于它可以为多个线程间建立不同的Condition Condition condition1 = lock.newCondition(); Condition condition2 = lock.newCondition(); Condition condition3 = lock.newCondition(); // loopNum:当前循环轮数 public void loopA(int loopNum) { //上锁 lock.lock(); try { while (number != 1) { //等待 condition1.await(); } System.out.println(Thread.currentThread().getName() + ", currentLoopNum is " + loopNum); number = 2; //唤醒 condition2.signal(); } catch (InterruptedException e) { e.printStackTrace(); } finally { //确保释放锁 lock.unlock(); } } public void loopB(int loopNum) { lock.lock(); try { while (number != 2) { condition2.await(); } System.out.println(Thread.currentThread().getName() + ", currentLoopNum is " + loopNum); number = 3; condition3.signal(); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } public void loopC(int loopNum) { lock.lock(); try { while (number != 3) { condition3.await(); } System.out.println(Thread.currentThread().getName() + ", currentLoopNum is " + loopNum); number = 1; condition1.signal(); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } }}public class TestABCAlternate { public static void main(String[] args) { AlternateDemo ad = new AlternateDemo(); new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 10; i++) ad.loopA(i); } }, "A").start(); new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 10; i++) ad.loopB(i); } }, "B").start(); new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 10; i++) ad.loopC(i); } }, "C").start(); }}
这道题充分体现了Condition的强大之处:它可以为多个线程间建立不同的Condition,并指定唤醒哪一个线程。
0 0
- 一道面试题:多个线程按顺序输出
- 一道Java线程面试题。3个线程顺序打印10次ABC.
- 一道多线程面试题分析(控制输出顺序)
- 多个线程按顺序输出
- java 一道线程面试题
- 一道线程同步面试题
- 一道面试题:三个线程循环有序输出10次ABCABC...
- 一道关于java线程的面试题
- 关于线程锁定的一道面试题
- 一道面试题:140个google面试题
- 一道面试题:通过wait和notify的两个线程交互输出thread1-1...thread1-5,thread2-6...thread2-10...
- 多线程按顺序依次打印ABCD---java多线程的一道经典面试题
- 一道关于静态变量的初始化顺序面试题
- 一道关于实例化顺序的C#面试题
- 一道关于实例化顺序的C#面试题
- 一道面试题--翻转英文句子中的单词顺序
- 顺序打印ABC------java多线程的一道经典面试题
- 一道关于try,finally执行顺序的面试题
- 多台web服务器之间共享session
- leetcode506: Relative Ranks
- Java设计模式之行为型模式(访问者模式)
- 3D打印前沿进展与技术介绍 —— 2016 RSNA 收获分享(下)
- python - 介绍(了解)
- 一道面试题:多个线程按顺序输出
- java性能调优基本原则
- HashSet-LinkedHashSet
- bzoj1012 [JSOI2008]最大数maxnumber
- hdu5826Rikka with Sequence 线段树
- 博弈论
- Linux应用领域
- 解决在vmware中安装centos7时遇到的无法连接网络问题
- UITableView莫名其妙多了一块空白区域