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小时内与您取得联系。