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文件写入权限设置