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实战之用Swing实现通讯录管理系统
Jun 13 Java/Android
探讨Java中的深浅拷贝问题
Jun 26 Java/Android
Spring实现内置监听器
Jul 09 Java/Android
java固定大小队列的几种实现方式详解
Jul 15 Java/Android
SpringBoot实现quartz定时任务可视化管理功能
Aug 30 Java/Android
springboot如何接收application/x-www-form-urlencoded类型的请求
Nov 02 Java/Android
SpringBoot整合阿里云视频点播的过程详解
Dec 06 Java/Android
java代码实现空间切割
Jan 18 Java/Android
Java实现简单小画板
Jun 10 Java/Android
springboot读取resources下文件的方式详解
Jun 21 Java/Android
IDEA中sout快捷键无效问题的解决方法
Jul 23 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
让你的PHP同时支持GIF、png、JPEG
2006/10/09 PHP
PHP 开源AJAX框架14种
2009/08/24 PHP
php5.2 Json不能正确处理中文、GB编码的解决方法
2014/03/28 PHP
php等比例缩放图片及剪切图片代码分享
2016/02/13 PHP
Yii2实现ActiveForm ajax提交
2017/05/26 PHP
PHP在同一域名下两个不同的项目做独立登录机制详解
2017/09/22 PHP
AutoSave/自动存储功能实现
2007/03/24 Javascript
jQuery 技巧大全(新手入门篇)
2009/05/12 Javascript
jQuery Ajax方法调用 Asp.Net WebService 的详细实例代码
2011/04/27 Javascript
jQuery 源码分析笔记(4) Ready函数
2011/06/02 Javascript
JavaScript中使用Object.create()创建对象介绍
2014/12/30 Javascript
javascript强制点击广告的方法
2015/02/06 Javascript
纯javascript实现四方向文本无缝滚动效果
2015/06/16 Javascript
jQuery实现简单的列表式导航菜单效果代码
2015/08/31 Javascript
JavaScript Promise 用法
2016/06/14 Javascript
js监听键盘事件的方法_原生和jquery的区别详解
2016/10/10 Javascript
JavaScript数组去重的几种方法效率测试
2016/10/23 Javascript
浅谈Node.js ORM框架Sequlize之表间关系
2017/07/24 Javascript
如何基于viewport vm适配移动端页面
2020/11/13 Javascript
sqlalchemy对象转dict的示例
2014/04/22 Python
pygame学习笔记(4):声音控制
2015/04/15 Python
OpenCV实现人脸识别
2017/04/07 Python
python实现趣味图片字符化
2019/04/30 Python
python定间隔取点(np.linspace)的实现
2019/11/27 Python
Python paramiko 模块浅谈与SSH主要功能模拟解析
2020/02/29 Python
python中的selenium安装的步骤(浏览器自动化测试框架)
2020/03/17 Python
python argparse模块通过后台传递参数实例
2020/04/20 Python
python爬虫利用selenium实现自动翻页爬取某鱼数据的思路详解
2020/12/22 Python
css3.0 图形构成实例练习二
2013/03/19 HTML / CSS
来自美国主售篮球鞋的零售商店:KICKSUSA
2017/11/28 全球购物
教师个人自我鉴定
2014/02/08 职场文书
调解协议书
2014/04/16 职场文书
北京英文导游词
2015/02/12 职场文书
Python中使用subprocess库创建附加进程
2021/05/11 Python
解决mysql问题:由于找不到MSVCR120.dll,无法继续执行代码
2021/06/26 MySQL
Pycharm远程调试和MySQL数据库授权问题
2022/03/18 MySQL