Java 多线程协作作业之信号同步


Posted in Java/Android onMay 11, 2022

一、信号同步

多线程很多时候是协作作业。比如4个线程对电商数据分季度统计,统计完成之后,再汇总。如何知道4个线程都执行完成呢,我们可以使用JDK1.5给我们提供的辅助类CountDownLatch(

减少计数)、CyclicBarrier(循环栅栏)、Semaphore(信号灯)。

二、基于时间维度

1、CountDownLatch

多少个协作线程就初始化CountDownLatch的构造参数是多少。

public static void main(String[] args) throws InterruptedException {
        final int NUM=6;
        //定义总数量;
        CountDownLatch countDownLatch=new CountDownLatch(NUM);
        for (int i = 0; i < NUM; i++) {
            new Thread(()->{
                System.out.println(Thread.currentThread().getName()+"线程,已执行!");
                //减少计数
                countDownLatch.countDown();
            },String.valueOf(i+1)).start();
        }
        //等待所有任务完成
        countDownLatch.await();
        System.out.println("所有线程任务已经执行完成!");
    }

Java 多线程协作作业之信号同步

2、CyclicBarrier

与减少计数类似

public static void main(String[] args) {
        final int NUM = 6;
        //定义循环数量及循环完成后的任务(Runnable接口实现);
        CyclicBarrier cyclicBarrier = new CyclicBarrier(NUM, () -> {
            System.out.println("所有线程任务已经执行完成!");
        });
        for (int i = 0; i < NUM; i++) {
            new Thread(()->{
                System.out.println(Thread.currentThread().getName()+"线程,已执行!");
                try {
                    //等待点或障碍点,等待所有任务完成,
                    cyclicBarrier.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
            },String.valueOf(i+1)).start();
        }
    }

Java 多线程协作作业之信号同步

三、基于信号维度

Semaphore,线程与信号是m:n,其中m>=n。

import java.util.Random;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
/*信号灯
* 6个线程,抢占三个信号
* */
public class SemaphoreDemo {
    public static void main(String[] args) {
        Semaphore semaphore=new Semaphore(3);
        for (int i = 0; i < 6; i++) {
            new Thread(()->{
                try {
                    //获取信号
                    semaphore.acquire();
                    System.out.println("线程:"+Thread.currentThread().getName()+"----获取信号");
                    int time = new Random().nextInt(5);
                    System.out.println(("线程:"+Thread.currentThread().getName()+"----休眠"+time+"s!"));
                    TimeUnit.SECONDS.sleep(time);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }finally {
                //    释放信号
                    System.out.println("线程:"+Thread.currentThread().getName()+"---释放信号");
                    semaphore.release();
                }
            },String.valueOf(i+1)).start();
        }
    }
}

首先线程4、1、3获取到信号,线程1释放信号后,线程2获得信号。线程2、3释放信号后,线程5、6获得信号。

Java 多线程协作作业之信号同步

到此这篇关于Java详解多线程协作作业之信号同步的文章就介绍到这了!


Tags in this post...

Java/Android 相关文章推荐
解析Java中的static关键字
Jun 14 Java/Android
详解Java实践之建造者模式
Jun 18 Java/Android
解决Swagger2返回map复杂结构不能解析的问题
Jul 02 Java/Android
Java生成读取条形码和二维码的简单示例
Jul 09 Java/Android
logback 实现给变量指定默认值
Aug 30 Java/Android
mapstruct的用法之qualifiedByName示例详解
Apr 06 Java/Android
Java 常见的限流算法详细分析并实现
Apr 07 Java/Android
SpringBoot中获取profile的方法详解
Apr 08 Java/Android
Android在Sqlite3中的应用及多线程使用数据库的建议
Apr 24 Java/Android
Android Studio实现带三角函数对数运算功能的高级计算器
May 20 Java/Android
Spring Security动态权限的实现方法详解
Jun 16 Java/Android
Android实现图片九宫格
Jun 28 Java/Android
Java 数组的使用
May 11 #Java/Android
Java Spring Lifecycle的使用
May 06 #Java/Android
java开发双人五子棋游戏
解决Springboot PostMapping无法获取数据的问题
May 06 #Java/Android
java版 联机五子棋游戏
Java版 简易五子棋小游戏
java版 简单三子棋游戏
May 04 #Java/Android
You might like
PHP4之COOKIE支持详解
2006/10/09 PHP
php学习之数据类型之间的转换代码
2011/05/29 PHP
php数组函数序列之array_push() 数组尾部添加一个或多个元素(入栈),返回新长度。
2011/11/07 PHP
IIS+fastcgi下PHP运行超时问题的解决办法详解
2013/06/20 PHP
php连接函数implode与分割explode的深入解析
2013/06/26 PHP
php引用传值实例详解学习
2013/11/06 PHP
linux下使用crontab实现定时PHP计划任务失败的原因分析
2014/07/05 PHP
PHP大转盘中奖概率算法实例
2014/10/21 PHP
PHP实现字符串大小写转函数的功能实例
2019/02/06 PHP
jquery 指南/入门基础
2007/11/30 Javascript
jQuery select的操作实现代码
2009/05/06 Javascript
JavaScript高级程序设计阅读笔记(五) ECMAScript中的运算符(一)
2012/02/27 Javascript
JavaScript高级程序设计阅读笔记(十六) javascript检测浏览器和操作系统-detect.js
2012/08/14 Javascript
关于extjs treepanel复选框选中父节点与子节点的问题
2013/04/02 Javascript
关于innerHTML后丢失动态绑定的EVENT问题解决方法
2013/05/19 Javascript
Three.js学习之Lamber材质和Phong材质
2016/08/04 Javascript
jQuery实现的放大镜效果示例
2016/09/13 Javascript
JavaScript之Canvas_动力节点Java学院整理
2017/07/04 Javascript
Angular17之Angular自定义指令详解
2018/01/21 Javascript
vue.js编译时给生成的文件增加版本号
2018/09/17 Javascript
ES6的解构赋值实例详解
2019/05/06 Javascript
js微信分享接口调用详解
2019/07/23 Javascript
[原创]Python入门教程3. 列表基本操作【定义、运算、常用函数】
2018/10/30 Python
python3利用ctypes传入一个字符串类型的列表方法
2019/02/12 Python
详解DeBug Python神级工具PySnooper
2019/07/03 Python
Django 解决由save方法引发的错误
2020/05/21 Python
keras得到每层的系数方式
2020/06/15 Python
Pycharm2020最新激活码|永久激活(附最新激活码和插件的详细教程)
2020/09/29 Python
HTML5 Web 存储详解
2016/09/16 HTML / CSS
遗体告别仪式答谢词
2014/01/23 职场文书
安全生产先进个人材料
2014/02/06 职场文书
励志演讲稿600字
2014/08/21 职场文书
入党积极分子对十八届四中全会期盼的思想汇报
2014/10/17 职场文书
综合测评自我评价
2015/03/06 职场文书
2015年学生会个人工作总结
2015/04/09 职场文书
暂住证证明
2015/06/19 职场文书