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 Nio使用NioSocket客户端与服务端交互实现方式
Jun 15 Java/Android
SpringDataJPA实体类关系映射配置方式
Dec 06 Java/Android
Eclipse+Java+Swing+Mysql实现电影购票系统(详细代码)
Jan 18 Java/Android
Java 垃圾回收超详细讲解记忆集和卡表
Apr 08 Java/Android
零基础学java之循环语句的使用
Apr 10 Java/Android
JavaWeb Servlet开发注册页面实例
Apr 11 Java/Android
JAVA 线程池(池化技术)的实现原理
Apr 28 Java/Android
java版 简单三子棋游戏
May 04 Java/Android
Java Spring Lifecycle的使用
May 06 Java/Android
详解Flutter自定义应用程序内键盘的实现方法
Jun 14 Java/Android
springboot读取resources下文件的方式详解
Jun 21 Java/Android
tree shaking对打包体积优化及作用
Jul 07 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
Iframe 自适应高度并实时监控高度变化的js代码
2009/10/30 Javascript
script标签的 charset 属性使用说明
2010/12/04 Javascript
用Jquery实现多级下拉框无刷新的联动
2010/12/22 Javascript
使用按钮控制以何种方式打开新窗口的属性介绍
2012/12/17 Javascript
关于ExtJS4.1:快捷键支持的问题
2013/04/24 Javascript
jQuery插件jFade实现鼠标经过的图片高亮其它变暗
2015/03/14 Javascript
AngularJS身份验证的方法
2016/02/17 Javascript
微信小程序 实例应用(记账)详解
2016/09/28 Javascript
Bootstrap复选框和单选按钮美化插件(推荐)
2016/11/23 Javascript
vue实现ajax滚动下拉加载,同时具有loading效果(推荐)
2017/01/11 Javascript
简单实现js鼠标跟随效果
2020/08/02 Javascript
JavaScript 引用类型实例详解【数组、对象、严格模式等】
2020/05/13 Javascript
[02:40]2018年度DOTA2最佳新人-完美盛典
2018/12/16 DOTA
Python连接MySQL并使用fetchall()方法过滤特殊字符
2016/03/13 Python
tensorflow 1.0用CNN进行图像分类
2018/04/15 Python
对Python信号处理模块signal详解
2019/01/09 Python
Flask-WTF表单的使用方法
2019/07/12 Python
如何在Django配置文件里配置session链接
2019/08/06 Python
Python SELENIUM上传文件或图片实现过程
2019/10/28 Python
Django项目中使用JWT的实现代码
2019/11/04 Python
Python 实现opencv所使用的图片格式与 base64 转换
2020/01/09 Python
Python 实现敏感目录扫描的示例代码
2020/05/21 Python
浅谈tensorflow使用张量时的一些注意点tf.concat,tf.reshape,tf.stack
2020/06/23 Python
Python数据模型与Python对象模型的相关总结
2021/01/26 Python
当当网官方旗舰店:中国图书销售夺金品牌
2018/04/02 全球购物
Surfdome西班牙:世界上最受欢迎的生活方式品牌
2019/02/13 全球购物
Farfetch巴西官网:奢侈品牌时尚购物平台
2020/10/19 全球购物
介绍一下SQL中union,intersect和minus
2012/04/05 面试题
广告学专业毕业生自荐信
2013/09/24 职场文书
商务会议邀请函
2014/01/09 职场文书
服务员岗位职责
2014/01/29 职场文书
党员组织关系介绍信
2014/02/13 职场文书
罚款通知怎么写
2015/04/22 职场文书
党小组评议意见
2015/06/02 职场文书
Html5大屏数据可视化开发的实现
2021/06/11 HTML / CSS
MySQL脏读,幻读和不可重复读
2022/05/11 MySQL