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将文件打包成zip存放或导出
Jun 11 Java/Android
解析Java异步之call future
Jun 14 Java/Android
解决MultipartFile.transferTo(dest) 报FileNotFoundExcep的问题
Jul 01 Java/Android
Java实现聊天机器人完善版
Jul 04 Java/Android
SpringRetry重试框架的具体使用
Jul 25 Java/Android
SpringBoot+Vue+JWT的前后端分离登录认证详细步骤
Sep 25 Java/Android
Spring Cloud 中@FeignClient注解中的contextId属性详解
Sep 25 Java/Android
SpringBoot2零基础到精通之数据库专项精讲
Mar 22 Java/Android
Java中的继承、多态以及封装
Apr 11 Java/Android
Java 异步任务计算FutureTask
Apr 28 Java/Android
ConditionalOnProperty配置swagger不生效问题及解决
Jun 14 Java/Android
SpringBoot详解自定义Stater的应用
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
让Json更懂中文(JSON_UNESCAPED_UNICODE)
2011/10/27 PHP
如何在php中正确的使用json
2013/08/06 PHP
PHP的Yii框架中移除组件所绑定的行为的方法
2016/03/18 PHP
div层的移动及性能优化
2010/11/16 Javascript
jQuery jqgrid 对含特殊字符json 数据的 Java 处理方法
2011/01/01 Javascript
收集的10个免费的jQuery相册
2011/02/26 Javascript
js 链式延迟执行DOME
2012/01/04 Javascript
浅析JavaScript中两种类型的全局对象/函数
2013/12/05 Javascript
基于JQuery实现的Select级联
2014/01/27 Javascript
一个简单的全屏图片上下打开显示网页效果示例
2014/07/08 Javascript
js获得当前系统日期时间的方法
2015/05/06 Javascript
jQuery中队列queue()函数的实例教程
2016/05/03 Javascript
easyui导出excel无法弹出下载框的快速解决方法
2016/11/10 Javascript
Angularjs实现分页和分页算法的示例代码
2016/12/23 Javascript
nodejs中使用HTTP分块响应和定时器示例代码
2017/03/19 NodeJs
JavaScript数据结构之二叉查找树的定义与表示方法
2017/04/12 Javascript
基于node.js实现微信支付退款功能
2017/12/19 Javascript
Jquery动态列功能完整实例
2019/08/30 jQuery
解决antd的Form组件setFieldsValue的警告问题
2020/10/29 Javascript
基于vue实现微博三方登录流程解析
2020/11/04 Javascript
python为tornado添加recaptcha验证码功能
2014/02/26 Python
Linux上安装Python的PIL和Pillow库处理图片的实例教程
2016/06/23 Python
Python代码打开本地.mp4格式文件的方法
2019/01/03 Python
pytorch 模型的train模式与eval模式实例
2020/02/20 Python
Python类中的装饰器在当前类中的声明与调用详解
2020/04/15 Python
python通过函数名调用函数的几种场景
2020/09/23 Python
CSS3 animation ? steps 函数详解
2019/08/30 HTML / CSS
德国药房apodiscounter中文官网:德国排名前三的网上药店
2019/06/03 全球购物
关于是否需要写商业计划书
2014/02/07 职场文书
模特职业生涯规划范文
2014/02/26 职场文书
销售经理竞聘书
2014/03/31 职场文书
个性婚礼策划方案
2014/05/17 职场文书
库房管理员岗位职责
2015/02/12 职场文书
PHP解决高并发问题
2021/04/01 PHP
详解Python魔法方法之描述符类
2021/05/26 Python
Python编解码问题及文本文件处理方法详解
2021/06/20 Python