• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Java > Java 多线程有序执行的几种方法总结

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

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了java多线程同步方法,java实现多线程的方法,java多线程方法,java多线程join方法,java多线程常用方法等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

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();
  }
 }
 }
}

</div>

    这种方法应该是比较常见的解决方案。利用原子递增控制线程准入顺序。

方法二

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;
}

</div>

    方法二使用了volatile关键字。让每个线程都能拿到最新的count的值,当其中一个线程执行++操作后,其他两个线程就会拿到最新的值,并检查是否符合准入条件。

ps:volatile不是线程安全的。而且两者没有任何关系。volatile变量不在用户线程保存副本,因此对所有线程都能提供最新的值。但试想,如果多个线程同时并发更新这个变量,其结果也是显而易见的,最后一次的更新会覆盖前面所有更新,导致线程不安全。在方法二中,一次只有一个线程满足准入条件,因此不存在对变量的并发更新。volatile的值是最新的与线程安全完全是不相干的,所以不要误用volatile实现并发控制。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • java多线程应用实现方法
  • Java 多线程有序执行的几种方法总结
  • Java线程监听,意外退出线程后自动重启的实现方法

相关文章

  • 2017-05-28java实现简单的webservice方式
  • 2017-05-28详解Java 自动装箱与拆箱的实现原理
  • 2017-05-28spring boot配合前端实现跨域请求访问
  • 2017-05-28springboot实现FastJson解析json数据的方法
  • 2017-05-28Java使用正则表达式实现找出数字功能示例
  • 2017-05-28java图形验证码生成工具类 web页面校验验证码
  • 2017-05-28spring MVC + bootstrap实现文件上传示例(带进度条)
  • 2017-05-28Java动态代理分析及理解
  • 2017-05-28java实例方法被覆盖,静态方法被隐藏Explain(详解)
  • 2017-05-28Java中char[]输出不是内存地址的原因详解

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • Spring Boot实现邮件注册功能示例代码
    • spring boot整合RabbitMQ(Direct模式)
    • java 基础之final、finally和finalize的区别
    • Java多线程的调度_动力节点Java学院整理
    • Java中Object.equals和String.equals的区别详解
    • 详解Spring boot+CXF开发WebService Demo
    • java后台利用Apache poi 生成excel文档提供前台下载示例
    • 实例解析Java设计模式编程中的适配器模式使用
    • 详解Spring Boot使用redis实现数据缓存
    • MyBatis拦截器:给参数对象属性赋值的实例

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有