全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Java 多线程有序执行的几种方法总结

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中实现让线程按照自己指定的顺序执行  # 都能  # 就会  # 会有  # 多个  # 没有任何  # 两种  # 这个问题  # 提出了  # 希望能  # 不存在  # 只有一个  # 不相干  # 其中一个  # 谢谢大家  # 显而易见  # 不安全  # 多线程  # 二中  # 提供最新  # 是否符合 


相关文章: 建站之星如何助力企业快速打造五合一网站?  图册素材网站设计制作软件,图册的导出方式有几种?  手机怎么制作网站教程步骤,手机怎么做自己的网页链接?  建站之星收费标准详解:套餐费用及年费价格表一览  临沂网站制作公司有哪些,临沂第四中学官网?  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  如何确保西部建站助手FTP传输的安全性?  建站之星代理如何优化在线客服效率?  建站主机系统SEO优化与智能配置核心关键词操作指南  如何通过老薛主机一键快速建站?  网站制作费用多少钱,一个网站的运营,需要哪些费用?  济南网站制作的价格,历城一职专官方网站?  ,如何利用word制作宣传手册?  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  SQL查询语句优化的实用方法总结  如何在万网开始建站?分步指南解析  如何在Golang中使用encoding/gob序列化对象_存储和传输数据  网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?  PHP 500报错的快速解决方法  自助网站制作软件,个人如何自助建网站?  装修招标网站设计制作流程,装修招标流程?  网站制作企业,网站的banner和导航栏是指什么?  网站制作的方法有哪些,如何将自己制作的网站发布到网上?  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?  linux top下的 minerd 木马清除方法  高端企业智能建站程序:SEO优化与响应式模板定制开发  阿里云网站制作公司,阿里云快速搭建网站好用吗?  C#如何在一个XML文件中查找并替换文本内容  公司门户网站制作流程,华为官网怎么做?  上海制作企业网站有哪些,上海有哪些网站可以让企业免费发布招聘信息?  网站制作与设计教程,如何制作一个企业网站,建设网站的基本步骤有哪些?  建站与域名管理如何高效结合?  建站主机选购指南与交易推荐:核心配置解析  成都响应式网站开发,dw怎么把手机适应页面变成网页?  建站中国官网:模板定制+SEO优化+建站流程一站式指南  广东企业建站网站优化与SEO营销核心策略指南  如何通过虚拟主机空间快速建站?  如何通过网站建站时间优化SEO与用户体验?  建站之星如何实现网站加密操作?  如何选择网络建站服务器?高效建站必看指南  建站主机CVM配置优化、SEO策略与性能提升指南  如何快速建站并高效导出源代码?  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  建站之星如何一键生成手机站?  网站按钮制作软件,如何实现网页中按钮的自动点击?  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  哈尔滨网站建设策划,哈尔滨电工证查询网站?  网站app免费制作软件,能免费看各大网站视频的手机app?  表情包在线制作网站免费,表情包怎么弄? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。