当前位置: 首页 > news >正文

济宁网站建设哪家好北京网站优化 卓立海创

济宁网站建设哪家好,北京网站优化 卓立海创,做网站需提供什么资料,wordpress能做成手机吗前言 最近笔者在面试过程中被问到如何实现线程轮流打印 ABC,当时没想到#xff0c;基础太差#xff0c;故作此文 Java 多线程轮流打印 ABC 的 4 种实现方式详解 在多线程编程中#xff0c;一个经典的面试题是#xff1a; 启动三个线程#xff0c;分别打印 A、B、C#x…前言 最近笔者在面试过程中被问到如何实现线程轮流打印 ABC,当时没想到基础太差故作此文 Java 多线程轮流打印 ABC 的 4 种实现方式详解 在多线程编程中一个经典的面试题是 启动三个线程分别打印 A、B、C要求按顺序轮流输出如 ABCABCABC… 重复若干次。 这个问题看似简单但涉及线程间的协作与通信。本文将从入门到进阶系统讲解 4 种主流解法并附带完整可运行的源码。 实现目标 假设每个线程负责打印一个字符 线程 A 打印 A线程 B 打印 B线程 C 打印 C 期望输出如下格式 ABCABCABCABCABC循环打印若干次如 5 次。 方法一synchronized wait/notifyAll 思路解析 使用一个共享变量 state 表示当前轮到哪个线程。每个线程进入临界区后判断是否是自己该打印的时机否则调用 wait() 挂起等待唤醒。 示例代码 /*1.设置共享变量state控制线程的执行顺序2.在打印方法中传入两个参数打印的内容 当前线程的state3.每个线程在调用打印方法时都要传入自己对应的顺序A0B1C2 */ public class PrintABC {private static int state 0;// 设置共享变量控制线程执行顺序private static final int COUNT 5;// 控制执行顺序private static Object lock new Object();// 用于加锁的对象public static void main(String[] args) {Thread t1 new Thread(() - {try {printChar(A, 0);} catch (InterruptedException e) {throw new RuntimeException(e);}});Thread t2 new Thread(() - {try {printChar(B, 1);} catch (InterruptedException e) {throw new RuntimeException(e);}});Thread t3 new Thread(() - {try {printChar(C, 2);} catch (InterruptedException e) {throw new RuntimeException(e);}});t1.start();t2.start();t3.start();}private static void printChar(String name, int curState) throws InterruptedException {int i 0;while(i COUNT) {synchronized (lock) {if(state % 3 curState) {// 是当前线程的执行顺序System.out.print(name );i;// 控制当前线程的执行的次数state;// 轮转到下一个线程lock.notifyAll();}else {// 轮不到当前线程 wait等待lock.wait();}}}} }优缺点 ✅ 简单易懂容易上手使用全局的共享变量state来控制线程的执行顺序❌ 效率较低notifyAll() 会唤醒所有线程。 方法二ReentrantLock Condition 思路解析 相比 synchronizedReentrantLock 提供更灵活的线程调度机制Condition 可以精准唤醒目标线程避免不必要的唤醒。 示例代码 /**第四种方法ReentrantLock Condition 来实现更加精确的线程间通信* ReentrantLock实现加锁解锁 Condition实现线程间的通信*/public static final int COUNT 5;public static int state 0;public static ReentrantLock lock new ReentrantLock();public static Condition conA lock.newCondition();public static Condition conB lock.newCondition();public static Condition conC lock.newCondition();public static void main(String[] args) {new Thread(() -printChar(A, 0, conA, conB)).start();new Thread(() -printChar(B, 1, conB, conC)).start();new Thread(() -printChar(C, 2, conC, conA)).start();}private static void printChar(String name, int curState, Condition curCondition, Condition nextCondition) {for(int i 0; i COUNT; i) {lock.lock();try {while(state % 3 ! curState)curCondition.await();// 是当前线程 执行System.out.print(name);state;nextCondition.signal();} catch (InterruptedException e) {throw new RuntimeException(e);}finally {lock.unlock();}}}优缺点 ✅ 支持精准唤醒性能优于 notifyAll❌ 编写稍复杂需要手动释放锁。 方法三Semaphore 信号量控制 思路解析 使用 3 个信号量 semA、semB、semC 控制线程谁可以打印线程执行后释放下一个信号量即可。 示例代码 /** 第二种方法使用Semaphore 信号量的方式控制执行顺序* 如何保证先打印AsemA, semB, semC 将A的许可设置为1B,C的许可设置为0则一定先执行A* 如何保证打印顺序在打印方法中传入三个参数name curSem, nextSem A-B B-C C-A* 执行完当前线程打印内容之后让下一个线程release一个许可*/private static final Semaphore semA new Semaphore(1);private static final Semaphore semB new Semaphore(0);private static final Semaphore semC new Semaphore(0);private static final int COUNT 5;public static void main(String[] args) {new Thread(() - printChar(A, semA, semB)).start();new Thread(() - printChar(B, semB, semC)).start();new Thread(() - printChar(C, semC, semA)).start();}private static void printChar(String name, Semaphore cur, Semaphore next) {for(int i 0; i COUNT;) {try {cur.acquire();System.out.print(name );i;next.release();} catch (InterruptedException e) {throw new RuntimeException(e);}}}优缺点 ✅ 信号机制清晰逻辑明确❌ 不支持灵活的线程增删 方法四BlockingQueue 队列传令 思路解析 为每个线程分配一个阻塞队列当队列有“令牌”时线程执行执行完毕后将令牌交给下一个队列。 阻塞队列是一个线程安全的队列 队列为空时take会阻塞队列为满时put会阻塞 示例代码 /** 第三种方法使用BlockingQueue作为令牌的方式来控制打印顺序* 创建三个队列每个队列分别打印对应需要打印的内容* 使用令牌来控制打印的顺序和使用semaphore类似* 在打印的方法中传入三个参数要打印的内容当前队列下一个队列*/public static BlockingQueueString qA new ArrayBlockingQueue(1);public static BlockingQueueString qB new ArrayBlockingQueue(1);public static BlockingQueueString qC new ArrayBlockingQueue(1);public static final int COUNT 5;public static void main(String[] args) throws InterruptedException {new Thread(() - printChar(A, qA, qB)).start();new Thread(() - printChar(B, qB, qC)).start();new Thread(() - printChar(C, qC, qA)).start();qA.put(go);}private static void printChar(String name, BlockingQueueString curQueue, BlockingQueueString nextQueue) {for(int i 0; i COUNT; i) {try {curQueue.take();// 等待令牌传递System.out.print(name );nextQueue.put(go);// 传递令牌} catch (InterruptedException e) {throw new RuntimeException(e);}}}优缺点 ✅ 队列阻塞机制天然适合线程通信❌ 每个线程都需独立队列稍显繁琐。 使用Semaphore和BlockingQueue的方式其实很像对于阻塞队列来说是通过传递令牌的方式来交接接力棒 总结对比 方法控制方式唤醒机制难度推荐场景synchronized状态 模 3 判断notifyAll⭐简单测试、学习入门ReentrantLock状态 Conditionsignal⭐⭐更精确唤醒推荐实际开发使用Semaphore信号量控制顺序release/acquire⭐⭐控制有限资源访问/固定顺序BlockingQueue令牌传递take/put⭐⭐结构直观适合理解通信流程 写在最后 线程按顺序轮流执行是实际开发中很常见的需求比如生产者消费者模型、有序打印日志、顺序处理任务等。 掌握以上几种方法不仅能应对面试题更能提升对 Java 并发编程的理解。 如果你觉得这篇文章对你有帮助不妨点个赞、收藏或转发给需要的朋友吧
http://www.hkea.cn/news/14490411/

相关文章:

  • 免费自助站制作在线wordpress 积分
  • 帮别人建网站赚钱吗网站首页制作模板
  • 购物网站模块是什么意思网站开发全程实例
  • 朔州建设机械网站动画设计专业好的学校
  • 建筑工程网官方网站wordpress自动评论插件
  • 建造电商网站个人网站设计怎么做
  • 贵州网站开发哪家便宜建设网站分析
  • 外贸网站设计注意事项网页设计代码案例
  • 常州手机网站开发怎么自己做网站服务器
  • 公司做网站的费用记什么科目上海今天最新发布会
  • 网站的联系我们怎么做wordpress 如何升级
  • 网站开发技术背景介绍房产采集网站源代码
  • 广州建网站价格郑州网站建设 云极
  • 英语门户网站织梦源码电脑上怎么运行wordpress
  • 网站推广需求要素做网站 公司 个体
  • 万网公司注册网站邢台企业建站
  • 二级网站内容建设要求百度一键安装
  • 优秀网站建设网页廊坊做网站公司
  • 化工行业网站建设嵌入式开发工程师前景
  • 深圳雅迅公司网站建设专业做美食视频的网站
  • 做网站的公司找客户wordpress淘宝客自动采集
  • 搜索动图素材的网站公司网站运营注意事项
  • 信誉比较好的商家可做网站dw怎么做打开网站跳出提示
  • 淮南建设公司网站怎么做网站需求分析
  • 如何找网站建设客户电影网站网页设计实训报告
  • ppt做视频模板下载网站有哪些内容广西seo搜索引擎优化
  • 自己开发网站要多少钱wordpress宾馆
  • 北京哪个公司做网站做蛋糕的网站
  • 怎样做网站亮照亮标一个公司能备案几个网站
  • wordpress搭建网站东莞响应式网站建设定制