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 相关文章推荐
如何解决springcloud feign 首次调用100%失败的问题
Jun 23 Java/Android
详解Spring事件发布与监听机制
Jun 30 Java/Android
Spring mvc是如何实现与数据库的前后端的连接操作的?
Jun 30 Java/Android
SpringBoot集成Druid连接池连接MySQL8.0.11
Jul 02 Java/Android
JavaGUI模仿QQ聊天功能完整版
Jul 04 Java/Android
Spring Boot mybatis-config 和 log4j 输出sql 日志的方式
Jul 26 Java/Android
Java后台生成图片的完整步骤
Aug 04 Java/Android
Java 实战项目之家居购物商城系统详解流程
Nov 11 Java/Android
Java9新特性之Module模块化编程示例演绎
Mar 16 Java/Android
springboot应用服务启动事件的监听实现
Apr 06 Java/Android
Mybatis-Plus 使用 @TableField 自动填充日期
Apr 26 Java/Android
MyBatis XPathParser解析器使用范例详解
Jul 15 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
Protoss热键控制
2020/03/14 星际争霸
PHP中的函数嵌套层数限制分析
2011/06/13 PHP
解析php中获取系统信息的方法
2013/06/25 PHP
开启PHP Static 关键字之旅模式
2015/11/13 PHP
PHP MVC框架路由学习笔记
2016/03/02 PHP
PHP实现的网站目录扫描索引工具
2016/09/08 PHP
javascript 简单抽屉效果的实现代码
2010/03/09 Javascript
AngularJS基础知识
2014/12/21 Javascript
JavaScript中操作字符串之localeCompare()方法的使用
2015/06/06 Javascript
windows下安装nodejs及框架express
2015/08/07 NodeJs
JS模拟的Map类实现方法
2016/06/17 Javascript
深入理解nodejs中Express的中间件
2017/05/19 NodeJs
M2实现Nodejs项目自动部署的方法步骤
2019/05/05 NodeJs
Laravel admin实现消息提醒、播放音频功能
2019/07/10 Javascript
Vue 禁用浏览器的前进后退操作
2020/09/04 Javascript
[03:41]DOTA2上海特锦赛小组赛第三日recap精彩回顾
2016/02/28 DOTA
[03:02]生活中的Dendi之野外度假篇
2016/08/09 DOTA
Linux 下 Python 实现按任意键退出的实现方法
2016/09/25 Python
Python中类的初始化特殊方法
2017/12/01 Python
Python管理Windows服务小脚本
2018/03/12 Python
python使用正则表达式来获取文件名的前缀方法
2018/10/21 Python
python针对不定分隔符切割提取字符串的方法
2018/10/26 Python
python 寻找离散序列极值点的方法
2019/07/10 Python
python批量读取文件名并写入txt文件中
2020/09/05 Python
Keras使用ImageNet上预训练的模型方式
2020/05/23 Python
jupyter notebook快速入门及使用详解
2020/11/13 Python
Django集成MongoDB实现过程解析
2020/12/01 Python
在HTML5中如何使用CSS建立不可选的文字
2014/10/17 HTML / CSS
卡西欧B级产品官方网站:Casio Outlet
2018/05/22 全球购物
信息系统专业个人求职信范文
2013/12/07 职场文书
《邮票齿孔的故事》教学反思
2014/02/22 职场文书
项目建议书格式
2014/03/12 职场文书
《理想的风筝》教学反思
2014/04/11 职场文书
体育专业求职信
2014/07/16 职场文书
税务干部群众路线教育实践活动对照检查材料
2014/09/20 职场文书
2014年十一国庆节爱国演讲稿
2014/09/23 职场文书