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 相关文章推荐
使用feign服务调用添加Header参数
Jun 23 Java/Android
实体类或对象序列化时,忽略为空属性的操作
Jun 30 Java/Android
每日六道java新手入门面试题,通往自由的道路
Jun 30 Java/Android
SpringBoot 拦截器妙用你真的了解吗
Jul 01 Java/Android
Java实现聊天机器人完善版
Jul 04 Java/Android
Java 实现限流器处理Rest接口请求详解流程
Nov 02 Java/Android
Spring依赖注入多种类型数据的示例代码
Mar 31 Java/Android
SpringBoot整合Minio文件存储
Apr 03 Java/Android
Qt数据库应用之实现图片转pdf
Jun 01 Java/Android
Java服务调用RestTemplate与HttpClient的使用详解
Jun 21 Java/Android
Android移动应用开发指南之六种布局详解
Sep 23 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
Discuz! 5.0.0论坛程序中加入一段js代码,让会员点击下载附件前自动弹出提示窗口
2007/04/18 PHP
php获取json数据所有的节点路径
2015/05/17 PHP
CodeIgniter钩子用法实例详解
2016/01/20 PHP
php设计模式之观察者模式定义与用法经典示例
2019/09/19 PHP
Javascript 复制数组实现代码
2009/11/26 Javascript
面向对象Javascript核心支持代码分享
2012/05/23 Javascript
JavaScript实现统计文本框Textarea字数增强用户体验
2012/12/21 Javascript
chrome下img加载对height()的影响示例探讨
2014/05/26 Javascript
详谈JavaScript内存泄漏
2014/11/14 Javascript
JavaScript实现select添加option
2015/07/03 Javascript
学习使用AngularJS文件上传控件
2016/02/16 Javascript
NodeJS收发GET和POST请求的示例代码
2017/08/25 NodeJs
React-Native中props具体使用详解
2017/09/04 Javascript
Express使用html模板的详细代码
2017/09/18 Javascript
js使用ajax传值给后台,后台返回字符串处理方法
2018/08/08 Javascript
vue微信分享的实现(在当前页面分享其他页面)
2019/04/16 Javascript
vue-router 前端路由之路由传值的方式详解
2019/04/30 Javascript
微信小程序实现watch监听
2020/06/04 Javascript
jQuery开发仿QQ版音乐播放器
2020/07/10 jQuery
vue中template的三种写法示例
2020/10/21 Javascript
[05:35]DOTA2英雄梦之声_第13期_拉比克
2014/06/21 DOTA
[08:07]DOTA2每周TOP10 精彩击杀集锦vol.8
2014/06/25 DOTA
Python开发编码规范
2006/09/08 Python
Python3 关于pycharm自动导入包快捷设置的方法
2019/01/16 Python
Python3.5模块的定义、导入、优化操作图文详解
2019/04/27 Python
python:批量统计xml中各类目标的数量案例
2020/03/10 Python
Python判断字符串是否为空和null方法实例
2020/04/26 Python
30年同学聚会邀请函
2014/01/25 职场文书
公司门卫管理制度
2014/02/01 职场文书
违反工作纪律检讨书
2014/02/15 职场文书
啦啦队口号大全
2014/06/16 职场文书
建筑安全责任书范本
2014/07/24 职场文书
2014年前台个人工作总结
2014/11/14 职场文书
2014年科室工作总结范文
2014/12/19 职场文书
八年级作文之感悟亲情
2019/11/20 职场文书
Python下opencv使用hough变换检测直线与圆
2021/06/18 Python