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常用的加密算法
Jun 11 Java/Android
Spring Data JPA使用JPQL与原生SQL进行查询的操作
Jun 15 Java/Android
springboot集成flyway自动创表的详细配置
Jun 26 Java/Android
利用Java设置Word文本框中的文字旋转方向的实现方法
Jun 28 Java/Android
JavaGUI模仿QQ聊天功能完整版
Jul 04 Java/Android
java泛型通配符详解
Jul 25 Java/Android
SSM项目使用拦截器实现登录验证功能
Jan 22 Java/Android
Flutter集成高德地图并添加自定义Maker的实践
Apr 07 Java/Android
SpringBoot中获取profile的方法详解
Apr 08 Java/Android
JAVA 线程池(池化技术)的实现原理
Apr 28 Java/Android
Java存储没有重复元素的数组
Apr 29 Java/Android
解决Springboot PostMapping无法获取数据的问题
May 06 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
php代码运行时间查看类代码分享
2011/08/06 PHP
PHP中文分词 自动获取关键词介绍
2012/11/13 PHP
PHP 只允许指定IP访问(允许*号通配符过滤IP)
2014/07/08 PHP
列举PHP的Yii 2框架的开发优势
2015/07/03 PHP
laravel 查询数据库获取结果实现判断是否为空
2019/10/24 PHP
jscript之List Excel Color Values
2007/06/13 Javascript
Google排名中的10个最著名的 JavaScript库
2010/04/27 Javascript
js实现省市联动效果的简单实例
2014/02/10 Javascript
使用coffeescript编写node.js项目的方法汇总
2015/08/05 Javascript
jQuery 1.9.1源码分析系列(十五)动画处理之缓动动画核心Tween
2015/12/03 Javascript
jquery对复选框(checkbox)的操作汇总
2016/01/13 Javascript
极易被忽视的javascript面试题七问七答
2016/02/15 Javascript
JS中使用mailto实现将用户在网页中输入的内容传递到本地邮件客户端
2016/10/08 Javascript
jquery动态创建div与input的实例代码
2016/10/12 Javascript
基于javascript处理nginx请求过程详解
2020/07/07 Javascript
Vue点击切换Class变化,实现Active当前样式操作
2020/07/17 Javascript
JavaScript中的几种继承方法示例
2020/12/06 Javascript
[51:36]EG vs VP 2018国际邀请赛淘汰赛BO3 第一场 8.24
2018/08/25 DOTA
探究python中open函数的使用
2016/03/01 Python
Python快速排序算法实例分析
2017/11/29 Python
Python中实现switch功能实例解析
2018/01/11 Python
Python如何将图像音视频等资源文件隐藏在代码中(小技巧)
2020/02/16 Python
使用python求斐波那契数列中第n个数的值示例代码
2020/07/26 Python
一个不错的HTML5 Canvas多层点击事件监听实例
2014/04/29 HTML / CSS
html5默认气泡修改的代码详解
2020/03/13 HTML / CSS
商务英语大学生职业生涯规划书范文
2014/01/01 职场文书
音乐教学反思
2014/02/02 职场文书
电子银行营销方案
2014/02/22 职场文书
房地产活动策划方案
2014/05/14 职场文书
春游踏青活动方案
2014/08/14 职场文书
公诉意见书范文
2015/06/05 职场文书
无工作证明怎么写
2015/06/15 职场文书
关于空气污染危害的感想
2015/08/11 职场文书
为什么中国式养孩子很累?
2019/08/07 职场文书
教你在 Java 中实现 Dijkstra 最短路算法的方法
2022/04/08 Java/Android
Java代码规范与质量检测插件SonarLint的使用
2022/08/05 Java/Android