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 22 Java/Android
详解Java实现数据结构之并查集
Jun 23 Java/Android
Java中使用Filter过滤器的方法
Jun 28 Java/Android
Java9新特性之Module模块化编程示例演绎
Mar 16 Java/Android
RestTemplate如何通过HTTP Basic Auth认证示例说明
Mar 17 Java/Android
SpringBoot2零基础到精通之数据库专项精讲
Mar 22 Java/Android
Java 垃圾回收超详细讲解记忆集和卡表
Apr 08 Java/Android
Flutter Navigator 实现路由传递参数
Apr 22 Java/Android
Spring Security动态权限的实现方法详解
Jun 16 Java/Android
Java使用HttpClient实现文件下载
Aug 14 Java/Android
Spring Boot实现文件上传下载
Aug 14 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
按下Enter焦点移至下一个控件的实现js代码
2013/12/11 Javascript
javascript函数作用域学习示例(js作用域)
2014/01/13 Javascript
红米手机抢购的js代码
2014/03/10 Javascript
jquery获取html元素的绝对位置和相对位置的方法
2014/06/20 Javascript
javascript中eval和with用法实例总结
2015/11/30 Javascript
js实现仿微博滚动显示信息的效果
2015/12/21 Javascript
js简单倒计时实现代码
2016/04/30 Javascript
jQuery的ready方法实现原理分析
2016/10/26 Javascript
jQuery实现的无缝广告图片左右滚动功能详解
2016/12/24 Javascript
JavaScript创建对象_动力节点Java学院整理
2017/06/27 Javascript
jQuery中.attr()和.data()的区别分析
2017/09/03 jQuery
thinkjs 文件上传功能实例代码
2017/11/08 Javascript
浅谈Vue-cli 命令行工具分析
2017/11/22 Javascript
在vscode里使用.vue代码模板的方法
2018/04/28 Javascript
vue中实现左右联动的效果
2018/06/22 Javascript
Vue-cli3.X使用px2 rem遇到的问题及解决方法
2019/08/08 Javascript
jQuery实现视频展示效果
2020/05/30 jQuery
解决vue-router 切换tab标签关闭时缓存问题
2020/07/22 Javascript
在antd4.0中Form使用initialValue操作
2020/11/02 Javascript
[01:02:07]Liquid vs Newbee 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
python检测lvs real server状态
2014/01/22 Python
python实现比较两段文本不同之处的方法
2015/05/30 Python
Python实现的端口扫描功能示例
2018/04/08 Python
Python虚拟环境的原理及使用详解
2019/07/02 Python
python3 写一个WAV音频文件播放器的代码
2019/09/27 Python
pymysql的简单封装代码实例
2020/01/08 Python
关于Keras模型可视化教程及关键问题的解决
2020/01/24 Python
pytorch梯度剪裁方式
2020/02/04 Python
买房子个人收入证明
2014/01/16 职场文书
计算机专业职业生涯规划范文
2014/01/19 职场文书
《阳光》教学反思
2014/02/23 职场文书
市级优秀班主任事迹材料
2014/05/13 职场文书
结对共建工作方案
2014/06/02 职场文书
世界地球日活动总结
2015/02/09 职场文书
未婚证明范本
2015/06/15 职场文书
python常见的占位符总结及用法
2021/07/02 Python