0

0

Java如何控制线程执行顺序 Java控制线程顺序执行技巧【进阶】

幻夢星雲

幻夢星雲

发布时间:2026-03-08 09:40:03

|

961人浏览过

|

来源于php中文网

原创

最直接等待线程结束的方式是调用其join()方法;countdownlatch适用于多线程协同启动或收尾;executorservice+future通过get()控制结果获取顺序;synchronized和volatile不保证执行顺序。

java如何控制线程执行顺序 java控制线程顺序执行技巧【进阶】

join() 强制等待指定线程结束

最直接、最常用的方式是让当前线程调用另一个线程的 join() 方法。它会阻塞当前线程,直到目标线程执行完毕。适用于已知明确依赖关系的场景,比如“线程B必须等线程A跑完再启动”。

注意点:

  • join() 是实例方法,必须在目标线程 start() 之后调用才有效;调用过早(如线程还没 start)不会报错,但可能立即返回,起不到等待效果
  • 可带超时参数:thread.join(5000),避免无限等待;超时后当前线程继续执行,不抛异常
  • 若被等待的线程抛出未捕获异常并终止,join() 仍会正常返回——它只等“结束”,不管是否异常退出

CountDownLatch 实现多线程协同启动或顺序收尾

当需要多个线程按固定阶段推进(比如“全部初始化完成后再统一开始计算”),CountDownLatch 比反复 join() 更灵活。它本质是一个倒计时门闩,构造时指定计数,每次 countDown() 减一,await() 阻塞直到归零。

典型用法示例:

立即学习Java免费学习笔记(深入)”;

CountDownLatch latch = new CountDownLatch(2);
new Thread(() -> { /* task A */ latch.countDown(); }).start();
new Thread(() -> { /* task B */ latch.countDown(); }).start();
latch.await(); // 主线程等 A 和 B 都完成
System.out.println("A and B done, now start C");
new Thread(() -> { /* task C */ }).start();

关键提醒:

  • 计数值不能重置,用完即废;需重复使用请换 CyclicBarrier
  • await() 可响应中断,抛 InterruptedException,务必处理或重新设置中断状态
  • 不要在 countDown() 前就调用 await() —— 虽然不会死锁,但可能导致逻辑提前触发

ExecutorService + Future 控制提交与获取顺序

在使用线程池时,不能靠 submit() 的调用顺序保证执行顺序,因为任务可能被不同工作线程并发执行。但你可以靠 Future.get() 的调用顺序来强制“获取结果”的顺序,间接控制后续逻辑流。

Play.ht
Play.ht

根据文本生成多种逼真的语音

下载

例如:

ExecutorService exec = Executors.newFixedThreadPool(3);
Future<String> f1 = exec.submit(() -> doStep1());
Future<String> f2 = exec.submit(() -> doStep2()); // 不依赖 f1 结果
Future<String> f3 = exec.submit(() -> doStep3());
<p>// 按需阻塞:先等 f1 完成,再等 f3,f2 可并行
String r1 = f1.get(); // 阻塞
String r3 = f3.get(); // 阻塞
String r2 = f2.get(); // 此时很可能已就绪,get() 很快返回

要注意:

  • Future.get() 是阻塞操作,且会传播任务内抛出的异常(包装为 ExecutionException
  • 如果任务本身有依赖(比如 step3 必须用 step1 的输出),那就得显式传递参数,Future 本身不提供依赖调度能力
  • 线程池大小会影响实际并发度;即使你按顺序 get(),若池子太小,step2 可能被卡住排队,拖慢整体

别踩这些坑:volatile / synchronized 不能保证执行顺序

有人误以为加 synchronized 块或用 volatile 变量就能控制线程执行先后——其实它们只解决可见性和原子性,不构成执行顺序约束。

比如下面这段代码:

synchronized(lock) { System.out.println("A"); }
synchronized(lock) { System.out.println("B"); }

这只能保证 A 和 B 不会交叉打印,但无法确保“线程1一定先执行A、线程2一定后执行B”。谁抢到锁谁先跑,仍是竞争决定的。

真正要顺序执行,核心思路只有一个:让后一个动作**显式等待前一个动作的完成信号**。这个信号可以是 join()CountDownLatchFuture.get()BlockingQueue.take(),甚至只是一个 while(!done) Thread.sleep(1)(不推荐,但原理一致)。没有“自动顺序”,只有“主动等待”。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

105

2023.09.25

c++中volatile关键字的作用
c++中volatile关键字的作用

本专题整合了c++中volatile关键字的相关内容,阅读专题下面的文章了解更多详细内容。

75

2025.10.23

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

763

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

376

2025.12.24

java多线程相关教程合集
java多线程相关教程合集

本专题整合了java多线程相关教程,阅读专题下面的文章了解更多详细内容。

27

2026.01.21

C++多线程相关合集
C++多线程相关合集

本专题整合了C++多线程相关教程,阅读专题下面的的文章了解更多详细内容。

28

2026.01.21

C# 多线程与异步编程
C# 多线程与异步编程

本专题深入讲解 C# 中多线程与异步编程的核心概念与实战技巧,包括线程池管理、Task 类的使用、async/await 异步编程模式、并发控制与线程同步、死锁与竞态条件的解决方案。通过实际项目,帮助开发者掌握 如何在 C# 中构建高并发、低延迟的异步系统,提升应用性能和响应速度。

103

2026.02.06

Java 并发编程高级实践
Java 并发编程高级实践

本专题深入讲解 Java 在高并发开发中的核心技术,涵盖线程模型、Thread 与 Runnable、Lock 与 synchronized、原子类、并发容器、线程池(Executor 框架)、阻塞队列、并发工具类(CountDownLatch、Semaphore)、以及高并发系统设计中的关键策略。通过实战案例帮助学习者全面掌握构建高性能并发应用的工程能力。

98

2025.12.01

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

46

2026.03.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.2万人学习

C# 教程
C# 教程

共94课时 | 10.9万人学习

Java 教程
Java 教程

共578课时 | 78.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号