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 相关文章推荐
SpringBoot项目中控制台日志的保存配置操作
Jun 18 Java/Android
Spring Data JPA的Audit功能审计数据库的变更
Jun 26 Java/Android
使用Springboot实现健身房管理系统
Jul 01 Java/Android
dubbo服务整合zipkin详解
Jul 26 Java/Android
解决persistence.xml配置文件修改存放路径的问题
Feb 24 Java/Android
Netty分布式客户端接入流程初始化源码分析
Mar 25 Java/Android
SpringBoot整合minio快速入门教程(代码示例)
Apr 03 Java/Android
Dubbo+zookeeper搭配分布式服务的过程详解
Apr 03 Java/Android
Java的Object类的九种方法
Apr 13 Java/Android
java高级用法JNA强大的Memory和Pointer
Apr 19 Java/Android
一文搞懂Java中的注解和反射
Jun 21 Java/Android
OpenFeign实现远程调用
Aug 14 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
蝙蝠侠:侠影之谜
2020/03/04 欧美动漫
星际争霸 Starcraft 秘技补丁
2020/03/14 星际争霸
yii实现级联下拉菜单的方法
2014/07/31 PHP
php类自动加载器实现方法
2015/07/28 PHP
PHP简单字符串过滤方法示例
2016/09/04 PHP
php中yar框架实例用法讲解
2020/12/27 PHP
基于Jquery与WebMethod投票功能实现代码
2011/01/19 Javascript
javascript获取函数名称、函数参数、对象属性名称的代码实例
2014/04/12 Javascript
纯javascript实现简单下拉刷新功能
2015/03/13 Javascript
js获取iframe中的window对象的实现方法
2016/05/20 Javascript
bootstrap使用validate实现简单校验功能
2016/12/02 Javascript
微信小程序开发animation心跳动画效果
2017/08/16 Javascript
Vue+webpack项目基础配置教程
2018/02/12 Javascript
vue 纯js监听滚动条到底部的实例讲解
2018/09/03 Javascript
JS实现简单的点赞与踩功能示例
2018/12/05 Javascript
JS阻止事件冒泡的方法详解
2019/08/26 Javascript
微信小程序wx.request的简单封装
2019/11/13 Javascript
微信小程序实现Swiper轮播图效果
2019/11/22 Javascript
详解Vue3 Composition API中的提取和重用逻辑
2020/04/29 Javascript
Python脚本实现代码行数统计代码分享
2015/03/10 Python
最基础的Python的socket编程入门教程
2015/04/23 Python
Python科学计算之NumPy入门教程
2017/01/15 Python
Python通过TensorFlow卷积神经网络实现猫狗识别
2019/03/14 Python
序列化Python对象的方法
2020/08/01 Python
python属于哪种语言
2020/08/16 Python
使用canvas来完成线性渐变和径向渐变的功能的方法示例
2019/07/25 HTML / CSS
植村秀美国官网:Shu Uemura美国
2019/03/19 全球购物
Optimalprint加拿大:在线打印服务
2020/04/03 全球购物
北大研究生linux应用求职信
2013/10/29 职场文书
新年主持词
2014/03/27 职场文书
新闻传媒系求职信范文
2014/04/19 职场文书
党员干部对十八届四中全会的期盼
2014/10/17 职场文书
退学证明范本3篇
2014/10/29 职场文书
工作经验交流材料
2014/12/30 职场文书
如何写辞职书
2015/02/26 职场文书
NodeJs内存占用过高的排查实战记录
2021/05/10 NodeJs