控制线程顺序循环输出ABC (java Condition 代码简洁版)
来源:互联网 发布:淘宝移动端网址 编辑:程序博客网 时间:2024/06/05 02:50
面试题:
编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。
网上的很多代码都是依赖于静态计数变量,通过计数变量求模计算轮到哪个线程执行,而自然环境中当输出"A"后,很自然应该输出"B",并不需要知道当前输出的次数。
public class WaitNotifyTest01 {public static void main(String[] args) {new Thread(new Task("C")).start();new Thread(new Task("B")).start();new Thread(new Task("A")).start();}static class Task implements Runnable {static String[] ids = { "A", "B", "C" };static Lock lock = new ReentrantLock();static Map<String, Condition> conditionMap = new HashMap<String, Condition>() {{this.put("A", lock.newCondition());this.put("B", lock.newCondition());this.put("C", lock.newCondition());}};final int COUNT = 10;String id;int index;boolean isFirst=true;Task(String id) {this.id = id;this.index = indexOf(id);}@Overridepublic void run() {try {lock.lock();for (int i = 0; i < COUNT; i++) {//如果首次执行,让"A"先执行while(isFirst&&!id.equals(ids[0])){isFirst=false;conditionMap.get(id).await();}System.out.println(id);//唤醒下一个id的线程conditionMap.get(nextId()).signal();//循环到最后一次时不再等待if(i<COUNT-1){conditionMap.get(id).await();}}} catch (InterruptedException e) {e.printStackTrace();} finally {lock.unlock();}}private int indexOf(String id) {for (int i = 0; i < ids.length; i++) {if (id.equals(ids[i])) {return i;}}return -1;}private String nextId() {if (index == ids.length - 1) {return ids[0];}return ids[index+1];}}}
0 0
- 控制线程顺序循环输出ABC (java Condition 代码简洁版)
- 通过线程按照顺序循环输出ABC n次
- 通过线程按照顺序循环输出ABC n次
- Java多线程:用三个线程控制循环输出10次ABC
- Java多线程:用三个线程控制循环输出10次ABC
- Java多线程:用三个线程控制循环输出10次ABC
- Java多线程:用三个线程控制循环输出10次ABC
- 用三个线程控制循环输出10次ABC
- java 多线程循环输出ABC
- java多线程:循环输出ABC
- java三线程循环有序打印ABC
- Java三线程循环有序打印ABC
- 三个线程轮流执行顺序打印ABC(二):使用Lock+Condition实现
- 写一个程序三个线程分别输出A,B,C, 顺序输出ABC十次,用java实现
- 顺序输出abc——Event线程同步
- 三个线程分别打印ABC,按顺序输出ABCABC...
- java多线程顺序执行并顺序输出ABC问题
- 线程顺序打印ABC
- 大家来参考。信息系统开发与管理(三)——考后总结
- 动态链接库的两种方式
- 有关于winfrom的datagridview中导数据到Excel文档中
- Python3连接MySQL数据库
- SQL语句中SUM函数
- 控制线程顺序循环输出ABC (java Condition 代码简洁版)
- 大家来参考。无法打开物理文件mdf,操作系统错误 5:"5(拒绝访问。)"
- Mac os 更新到Yosemite 10.10 打开eclipse时提示“您需要安装旧的java se 6 才能允许打开eclipse”
- Qt moveToThread使用说明
- SQL Server 2008中文版标准教程读书笔记 Transact-SQL编程(复习SQL Server 五)
- 20141021
- 大家来参考。此服务器支持661版及更低版本。不支持降级路径。
- 搭建MySQL的Master/Slave架构
- oracle 创建存储过程