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 相关文章推荐
Spring Cache和EhCache实现缓存管理方式
Jun 15 Java/Android
浅谈什么是SpringBoot异常处理自动配置的原理
Jun 21 Java/Android
Java常用工具类汇总 附示例代码
Jun 26 Java/Android
Java使用httpRequest+Jsoup爬取红蓝球号码
Jul 02 Java/Android
解决persistence.xml配置文件修改存放路径的问题
Feb 24 Java/Android
Spring Boot DevTools 全局配置学习指南
Mar 31 Java/Android
Java 常见的限流算法详细分析并实现
Apr 07 Java/Android
Java8 Stream API 提供了一种高效且易于使用的处理数据的方式
Apr 13 Java/Android
Spring Boot配合PageHelper优化大表查询数据分页
Apr 20 Java/Android
Android开发之底部导航栏的快速实现
Apr 28 Java/Android
springboot读取resources下文件的方式详解
Jun 21 Java/Android
Spring boot实现上传文件到本地服务器
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
7个鲜为人知却非常实用的PHP函数
2015/07/01 PHP
ThinkPHP3.2.2实现持久登录(记住我)功能的方法
2016/05/16 PHP
判断控件是否已加载完成的代码
2010/02/24 Javascript
javascript 二维数组的实现与应用
2010/03/16 Javascript
javascript性能优化之事件委托实例详解
2015/12/12 Javascript
javascript实现计时器的简单方法
2016/02/21 Javascript
java中String类型变量的赋值问题介绍
2016/03/23 Javascript
js修改onclick动作的四种方法(推荐)
2016/08/18 Javascript
React创建组件的三种方式及其区别
2017/01/12 Javascript
JavaScript实现的原生态Tab标签页功能【兼容IE6】
2017/09/18 Javascript
使用vue实现简单键盘的示例(支持移动端和pc端)
2017/12/25 Javascript
使用Vue.js和Flask来构建一个单页的App的示例
2018/03/21 Javascript
jQuery实现的点击显示隐藏下拉菜单功能完整示例
2019/05/17 jQuery
微信小程序实现类似微信点击语音播放效果
2020/03/30 Javascript
Jquery $.map使用方法实例详解
2020/09/01 jQuery
[56:47]Ti4 循环赛第三日 iG vs Liquid
2014/07/12 DOTA
在Python中实现贪婪排名算法的教程
2015/04/17 Python
python实现的多线程端口扫描功能示例
2017/01/21 Python
Django框架视图层URL映射与反向解析实例分析
2019/07/29 Python
详解Python用三种方式统计词频的方法
2019/07/29 Python
Pycharm+Python工程,引用子模块的实现
2020/03/09 Python
Python稀疏矩阵及参数保存代码实现
2020/04/18 Python
如何理解python面向对象编程
2020/06/01 Python
Python tkinter界面实现历史天气查询的示例代码
2020/08/23 Python
Nike德国官网:Nike.com (DE)
2018/11/13 全球购物
日本最大的购物网站乐天市场国际版:Rakuten Global Market(支持中文)
2020/02/03 全球购物
C#笔试题和英文面试题
2013/02/07 面试题
Linux内核产生并发的原因
2016/11/08 面试题
师范应届生教师求职信
2013/11/05 职场文书
幼儿园消防安全制度
2014/01/26 职场文书
函授自我鉴定范文
2014/02/06 职场文书
母亲节感恩活动记录
2014/03/16 职场文书
服务质量承诺书
2014/03/27 职场文书
节能减耗标语
2014/06/21 职场文书
中学生勤俭节约倡议书
2015/04/29 职场文书
Navicat Premium自定义 sql 标签的创建方式
2022/09/23 数据库