Java 多线程有序执行的几种方法总结
发布时间 - 2026-01-11 00:13:59 点击率:次Java 多线程有序执行的几种方法总结

同事无意间提出了这个问题,亲自实践了两种方法。当然肯定还会有更多更好的方法。
方法一
import java.util.concurrent.atomic.AtomicInteger;
public class OrderedThread1 {
static AtomicInteger count = new AtomicInteger(0);
public static void main(String[] args) throws InterruptedException {
Task task1 = new Task(count, 0);
Task task2 = new Task(count, 1);
Task task3 = new Task(count, 2);
Thread thread1 = new Thread(task1);
Thread thread2 = new Thread(task2);
Thread thread3 = new Thread(task3);
thread1.setDaemon(true);
thread2.setDaemon(true);
thread3.setDaemon(true);
thread1.start();
thread2.start();
thread3.start();
Thread.sleep(1 * 1000);
}
}
class Task implements Runnable {
private AtomicInteger count;
private int order;
public Task(AtomicInteger count, int order) {
this.count = count;
this.order = order;
}
@Override
public void run() {
while (true) {
if (count.get() % 3 == order) {
System.out.println(Thread.currentThread().getName() + " ===== "+ order);
count.incrementAndGet();
}
}
}
}
这种方法应该是比较常见的解决方案。利用原子递增控制线程准入顺序。
方法二
public class OrderedThread2 {
static Holder holder = new Holder();
public static void main(String[] args) throws InterruptedException {
Task1 task1 = new Task1(holder, 0);
Task1 task2 = new Task1(holder, 1);
Task1 task3 = new Task1(holder, 2);
Thread thread1 = new Thread(task1);
Thread thread2 = new Thread(task2);
Thread thread3 = new Thread(task3);
thread1.setDaemon(true);
thread2.setDaemon(true);
thread3.setDaemon(true);
thread1.start();
thread2.start();
thread3.start();
Thread.sleep(1 * 1000);
}
}
class Task1 implements Runnable {
Holder holder;
int order;
public Task1(Holder holder, int order) {
this.holder = holder;
this.order = order;
}
@Override
public void run() {
while (true) {
if (holder.count % 3 == order) {
System.out.println(Thread.currentThread().getName() + " ===== "+ order);
holder.count ++;
}
}
// int i = 0;
// while(i ++ < 10000){
// holder.count ++;
// }
}
}
class Holder {
volatile int count = 0;
}
方法二使用了volatile关键字。让每个线程都能拿到最新的count的值,当其中一个线程执行++操作后,其他两个线程就会拿到最新的值,并检查是否符合准入条件。
ps:volatile不是线程安全的。而且两者没有任何关系。volatile变量不在用户线程保存副本,因此对所有线程都能提供最新的值。但试想,如果多个线程同时并发更新这个变量,其结果也是显而易见的,最后一次的更新会覆盖前面所有更新,导致线程不安全。在方法二中,一次只有一个线程满足准入条件,因此不存在对变量的并发更新。volatile的值是最新的与线程安全完全是不相干的,所以不要误用volatile实现并发控制。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# Java
# 多线程有序执行
# 多线程有序执行详解
# 多线程有序执行两种方法
# Java让多线程按顺序执行的几种方法
# Java实现指定线程执行顺序的三种方式示例
# Java多线程按指定顺序同步执行
# java如何实现多线程的顺序执行
# 在Java中实现让线程按照自己指定的顺序执行
# 都能
# 就会
# 会有
# 多个
# 没有任何
# 两种
# 这个问题
# 提出了
# 希望能
# 不存在
# 只有一个
# 不相干
# 其中一个
# 谢谢大家
# 显而易见
# 不安全
# 多线程
# 二中
# 提供最新
# 是否符合
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?
php打包exe后无法访问网络共享_共享权限设置方法【教程】
打开php文件提示内存不足_怎么调整php内存限制【解决方案】
如何为不同团队 ID 动态生成多个非值班状态按钮
如何在阿里云购买域名并搭建网站?
弹幕视频网站制作教程下载,弹幕视频网站是什么意思?
Claude怎样写结构化提示词_Claude结构化提示词写法【教程】
如何制作一个表白网站视频,关于勇敢表白的小标题?
JavaScript如何实现错误处理_try...catch如何捕获异常?
如何批量查询域名的建站时间记录?
公司网站制作价格怎么算,公司办个官网需要多少钱?
如何用PHP快速搭建高效网站?分步指南
Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理
如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?
如何在腾讯云免费申请建站?
如何用VPS主机快速搭建个人网站?
Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转
Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】
Laravel怎么生成URL_Laravel路由命名与URL生成函数详解
Gemini怎么用新功能实时问答_Gemini实时问答使用【步骤】
Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程
如何在云主机上快速搭建网站?
Laravel路由怎么定义_Laravel核心路由系统完全入门指南
百度浏览器如何管理插件 百度浏览器插件管理方法
Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧
实例解析angularjs的filter过滤器
网站制作大概多少钱一个,做一个平台网站大概多少钱?
jQuery中的100个技巧汇总
Laravel如何编写单元测试和功能测试?(PHPUnit示例)
如何快速生成专业多端适配建站电话?
javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】
高防服务器租用首荐平台,企业级优惠套餐快速部署
如何快速重置建站主机并恢复默认配置?
Laravel如何清理系统缓存命令_Laravel清除路由配置及视图缓存的方法【总结】
如何快速查询域名建站关键信息?
如何在阿里云虚拟服务器快速搭建网站?
郑州企业网站制作公司,郑州招聘网站有哪些?
如何续费美橙建站之星域名及服务?
javascript事件捕获机制【深入分析IE和DOM中的事件模型】
微信小程序 配置文件详细介绍
在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?
油猴 教程,油猴搜脚本为什么会网页无法显示?
python中快速进行多个字符替换的方法小结
如何在VPS电脑上快速搭建网站?
标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南
企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?
如何构建满足综合性能需求的优质建站方案?
浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】
Linux系统运维自动化项目教程_Ansible批量管理实战
Laravel storage目录权限问题_Laravel文件写入权限设置

