多线程有序执行,九大方案!

本文首发于公众号:托尼学长,立个写 1024 篇原创技术面试文章的flag,欢迎过来视察监督~

在Java中,如何控制多个线程的执行顺序?这也是面试官非常喜欢问的一道Java基础面试题。

而且你给他回答一两个,两三个方案还不行,面试官还会一直在那问你,还有吗?还有吗?还有吗?

有有有,咱们就一口气输出九个方案,让他一次管够!

方案1:Thread.join()

join()方法的作用是‌让当前线程等待指定线程执行完毕后再继续执行‌,主要用于确保线程执行顺序或依赖关系,通过两次join调用形成链式依赖,确保A→B→C执行顺序。

方案2:CompletableFuture

CompletableFuture 提供丰富的异步任务编排方法,thenRun() 表示前一个任务执行完毕后,执行下一个任务,天然支持顺序执行。

方案3:CountDownLatch

CountDownLatch 初始化一个计数器,线程调用 await() 会阻塞,直到计数器通过 countDown() 减为 0 才继续执行。通过下一个线程等待前一个线程的计数器归零的方式,来控制线程间的执行顺序。

方案4:CyclicBarrier

CyclicBarrier 让一到多个线程在屏障处等待,直到所有线程都到达屏障后才继续执行,通过分阶段执行控制顺序,每个阶段完成后触发下一个阶段。

方案5:Semaphore

Semaphore 控制同时访问临界资源的线程数。通过初始化信号量为 0,让后续线程阻塞,前一个线程执行完毕后释放信号量,允许下一个线程执行。

方案6:单线程线程池

在单线程的线程池中,保证任务按提交顺序来串行执行,也就间接地控制了线程执行顺序。

方案7:ReentrantLock + Condition

通过ReentrantLock配合Condition可实现精准唤醒,让每个线程都对应一个Condition,执行完毕后唤醒下一个线程,从而实现了线程的有序执行。

方案8:Phaser

Phaser的核心作用是 让多个线程按阶段同步执行,所有线程必须完成当前阶段后,才能一起进入下一个阶段。

相比于仅支持单次屏障等待的 CyclicBarrier,Phaser 支持动态增减参与线程、重复使用阶段,灵活性更高。

方案9:BlockingQueue信号传递

利用Java内置的阻塞队列特性,以极简代码实现严格的执行顺序控制,是生产者、消费者场景中的经典解决方案。

信不信,你把这多线程有序执行的九大方案跟面试官说完,他一定会目瞪口呆的,这时你一定别忘了补刀一句:"够不够,不够我再跟你说九种!"

相关推荐
程序员老邢21 小时前
【技术底稿 23】Ollama + Docker + Ubuntu 部署踩坑实录:网络通了,参数还在调
java·经验分享·后端·ubuntu·docker·容器·milvus
JackSparrow41421 小时前
彻底理解Java NIO(一)C语言实现 单进程+多进程+多线程 阻塞式I/O 服务器详解
java·linux·c语言·网络·后端·tcp/ip·nio
小江的记录本21 小时前
【微服务与云原生架构】Serverless架构、FaaS/BaaS、核心原理、优缺点
java·后端·微服务·云原生·架构·系统架构·serverless
前端摸鱼匠21 小时前
【AI大模型春招面试题29】对比学习(Contrastive Learning)在大模型预训练中的应用?
人工智能·学习·算法·面试·大模型·求职招聘
神奇小汤圆21 小时前
阿里云社招一面:数据库中有 1000 万数据的时候怎么分页查询?
后端
威迪斯特21 小时前
Cobra框架:Go语言命令行开发的现代化利器
开发语言·前端·后端·golang·cobra·交互模型·命令行框架
其实防守也摸鱼21 小时前
面试常问问题总结--渗透测试工程师方向
网络·sql·面试·职场和发展·xss·工具·owasp
楼田莉子21 小时前
CMake学习:动态库场景下的应用
c++·后端·学习·软件构建
威迪斯特21 小时前
Gorilla框架:Go语言生态中的模块化开发利器
运维·开发语言·后端·golang·web框架·维护·gorilla
光影少年1 天前
vite+rust生态链工具链
开发语言·前端·后端·rust·前端框架