Java进阶——多线程相关,实际应用中的积累,持续更新

在这里插入图片描述

目录

  • 多线程相关
    • CountDownLatch
      • 赛跑的案例
      • countDownLatch.await(300, TimeUnit.SECONDS);
  • Java其他进阶
    • Map的put方法
    • 只放一个元素的集合


多线程相关

CountDownLatch

案例:主线程的执行需要等待子线程执行完,等各个线程执行完毕后,主线程做收尾的工作

  • 初始化一个:final CountDownLatch latch = new CountDownLatch(3);
  • 线程池中的子线程调用 countDown方法进行减1;
  • 主线程启动后,等待子线程不断减1,直到为0后,主线程继续往下执行;
package com.tianju.myTest;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class CountdownLatchTest1 {

    public static void main(String[] args) {
        ExecutorService service = Executors.newFixedThreadPool(3);
        final CountDownLatch latch = new CountDownLatch(3);
        for (int i = 0; i < 3; i++) {
            Runnable runnable = new Runnable() {

                @Override
                public void run() {
                    try {
                        System. out.println("子线程" + Thread.currentThread().getName() + "开始执行");
                        Thread. sleep((long) (Math. random() * 10000));
                        System. out.println("子线程" + Thread.currentThread().getName() + "执行完成");
                        latch.countDown(); // 当前线程调用此方法,则计数减一
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            };
            service.execute(runnable);
        }

        try {
            System. out.println("主线程" + Thread.currentThread().getName() + "等待子线程执行完成..." );
            latch.await(); // 阻塞当前线程,直到计时器的值为0
            System. out.println("主线程" + Thread.currentThread().getName() + "开始执行...");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally {
            service.shutdown();
        }
    }
}

赛跑的案例

案例2:4名选手参加赛跑,选手需要等待裁判发送指令;裁判发送完指令后,需要等所有选手到达终点;所有选手到达终点后,裁判汇总成绩。

  • 主线程:裁判发指令,裁判等选手到达终点,到达终点后,汇总成绩;
  • 子线程:每个选手需要阻塞在裁判发指令之前,主线程发指令后,子线程继续运行;此时主线程阻塞,所有子线程结束后,主线程继续运行

实现的思路

  • 定义两个CountDownLatch,一个为1,一个为4;
  • CountDownLatch(1),用来控制等待裁判指令,主线程先休眠,让出资源,让子线程获得cpu资源,子线程通过await 阻塞;
  • 主线程休眠结束后,对1进行-1,然后await 4 阻塞,触发子线程,子线程继续运行;
  • 子线程在运行过程中对于4 进行-1,等到值为0时,触发主线程的await 4 阻塞;
  • 主线程继续运行,裁判进行成绩的汇总

在这里插入图片描述

在这里插入图片描述

package com.tianju.myTest;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
// https://www.cnblogs.com/tstd/p/4987935.html
public class CountdownLatchTest2 {

    public static void main(String[] args) {
        ExecutorService service = Executors.newCachedThreadPool();
        final CountDownLatch cdOrder = new CountDownLatch(1);
        final CountDownLatch cdAnswer = new CountDownLatch(4);
        for (int i = 0; i < 4; i++) {
            Runnable runnable = new Runnable() {
                public void run() {
                    try {
                        System.out.println("选手" + Thread.currentThread().getName() + "正等待裁判发布口令");
                        cdOrder.await(); // 线程都阻塞在这里等待释放
                        System.out.println("选手" + Thread.currentThread().getName() + "已接受裁判口令");
                        Thread.sleep((long) (Math. random() * 10000));
                        System.out.println("选手" + Thread.currentThread().getName() + "到达终点");
                        cdAnswer.countDown(); // 进行-1操作,4个线程都在操作CountDownLatch
                        System.out.println("cdAnswer---->:"+cdAnswer);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            };
            service.execute(runnable);
        }
        try {
            Thread. sleep((long) (Math. random() * 10000));

            System. out.println("裁判" + Thread.currentThread ().getName() + "即将发布口令" );
            cdOrder.countDown();
            System. out.println("裁判" + Thread.currentThread ().getName() + "已发送口令,正在等待所有选手到达终点" );
            cdAnswer.await();
            System. out.println("所有选手都到达终点" );
            System. out.println("裁判" + Thread.currentThread ().getName() + "汇总成绩排名" );
        } catch (Exception e) {
            e.printStackTrace();
        }
        service.shutdown();

    }
}

countDownLatch.await(300, TimeUnit.SECONDS);

await方法的对比

  • 没有设置时间,会一直阻塞,直到countdown为0;
  • 设置了时间,在超过这个时间后,解除阻塞,返回false;

线程一直阻塞的情况

在这里插入图片描述

到达时间后,就解除阻塞,并返回false

在这里插入图片描述

-1成功,返回true

在这里插入图片描述

Java其他进阶

Map的put方法

  • Map 的 put 方法其实是有返回值的

在这里插入图片描述

package com.tianju.myTest;

import java.util.HashMap;
import java.util.concurrent.ConcurrentHashMap;

/**
 * hashMap 的 put 方法其实是有返回值的
 */
public class ConHashMap {
    public static void main(String[] args) {
        ConcurrentHashMap<Object, Object> concurrentHashMap = new ConcurrentHashMap<>();
        // 如果有了键为 pet,还能往里面放
        concurrentHashMap.put("pet", 567);
        Object put = concurrentHashMap.put("pet", "task");
        System.out.println(put);
        if (put!=null){
            System.out.println("======== current key used! ========");
        }
        System.out.println(concurrentHashMap);

        HashMap<Object, Object> hashMap = new HashMap<>();
        hashMap.put("pet", 123);
        Object pet = hashMap.put("pet", 561);
        System.out.println(pet);
        System.out.println(hashMap);
    }
}

只放一个元素的集合

  • 基于内存或者业务的考虑,有时候集合只放一个元素,可以用collections下面的singleton集合

在这里插入图片描述

package com.tianju.myTest;

import java.util.Collections;
import java.util.List;

/**
 * 只能存放一个元素的 List,不会造成内存空间的浪费
 */
public class SingletonListTest {
    public static void main(String[] args) {
        String s = "hello, singleton";
        List<String> list = Collections.singletonList(s);
        list.add("second element");
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/177585.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用gin 代理 web网页

问web项目的代理&#xff0c;业界常用的方案是nginx做代理&#xff0c;这个是网上最多资料的。 因为我需要做自己的流量转发&#xff0c;也就是所有访问都要经过我的一个流量分发微服务&#xff0c;这和nginx作用冲突了。如果再加个nginx来做第一层方向代理和网页的静态资源代…

Linux学习第45天:Linux 多点电容触摸屏实验(三):难忘记第一次牵你手的温存

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 本章的思维导图如下&#xff1a; 五、tslib移植与使用 通过 tslib 来直观的测试多点电容触摸屏驱动。 1、tslib移植 1&#xff09;、获取tslib源码 git 地址为…

语音识别技术在医疗行业中的应用案例

随着语音识别技术和计算机视觉技术的不断提高&#xff0c;现代医学正在进入全面数字化时代。 追求高质量的训练数据是人工智能产业的信条&#xff0c;得到更为精准的语音机器模型更离不开语音数据的不断供给。本文讲介绍: 什么是语音识别技术语音识别技术如何应用于医疗行业 …

【办公常识】写好的代码如何上传?使用svn commit

首先找到对应的目录 找到文件之后点击SVN Commit

基于天鹰算法优化概率神经网络PNN的分类预测 - 附代码

基于天鹰算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于天鹰算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于天鹰优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神经网络的光滑…

python解决登录图形验证码

摘要:测试过程中经常遇到图片验证码,以下主要是调用百度OCR图片识别获取验证码,实现登录 1、百度云申请创建应用

shopee数据分析软件:了解市场趋势,分析竞争对手,优化运营策略

在当今数字化时代&#xff0c;数据已经成为了企业决策的重要依据。对于电商行业来说&#xff0c;数据更是至关重要。如果你想在电商领域中脱颖而出&#xff0c;那么你需要一款强大的数据分析工具来帮助你更好地了解市场、分析竞争对手、优化运营策略。而知虾数据软件就是这样一…

大二第五周总结

你知道的&#xff0c;向来如此&#xff0c;从来没人关心&#xff0c;世人从来只看重结果。对你了解越多的人&#xff0c;往你心里面捅刀子的时候也是最狠&#xff0c;不过跟之前不一样了&#xff0c;又不是曾经那个任人欺负的小孩儿了&#xff0c;所有的努力在别人眼里就是屁都…

centos7安装MySQL—以MySQL5.7.30为例

centos7安装MySQL—以MySQL5.7.30为例 本文以MySQL5.7.30为例。 官网下载 进入MySQL官网&#xff1a;https://www.mysql.com/ 点击DOWNLOADS 点击链接&#xff1b; 点击如上链接&#xff1a; 选择对应版本&#xff1a; 点击下载。 安装 将下载后的安装包上传到/usr/local下…

网工内推 | 合资公司网工,CCNP/HCIP认证优先,朝九晚六

01 中企网络通信技术有限公司 招聘岗位&#xff1a;网络工程师 职责描述&#xff1a; 1、按照工作流程和指引监控网络运行情况和客户连接状况&#xff1b; 2、确保各监控系统能正常运作&#xff1b; 3、快速响应各个网络告警事件&#xff1b; 4、判断出网络故障&#xff0c;按…

sqlserver==索引解析,执行计划,索引大小

1创建测试表 -- 创建大型表 CREATE TABLE LargeTableWithIndex (ID int IDENTITY(1,1) PRIMARY KEY,IndexedColumn int,NonIndexedColumn nvarchar(255),OtherData nvarchar(255) );2插入测试数据 -- 使用 T-SQL 插入大量数据 DECLARE @i int = 1; WHILE @i <= 100000 -- …

git常用命令(git github ssh)

目录 1、语法说明2、本地仓库相关操作建立一个git文件(git init)把工作区的文件添加到暂存区(git add)把暂存区的文件添加到本地仓库(git commit)查看暂存区和本地仓库中的文件(git ls-files)查看文件夹下所有文件的状态(git status)查看版本库中的提交记录(git log)恢复的文件…

基于原子轨道搜索算法优化概率神经网络PNN的分类预测 - 附代码

基于原子轨道搜索算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于原子轨道搜索算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于原子轨道搜索优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xf…

还记得高中生物书上的莫斯密码吗?利用Python破解摩斯密码的代码示例!

文章目录 前言摩尔斯电码Python实现摩斯密码对照表加密解密测试 完整代码总结关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面试资料六、Py…

依赖库:Ceres-solver-2.0.0安装

依赖库&#xff1a;Ceres-solver-2.0.0安装 前言安装ceres-solver-2.0.0验证 前言 Ceres Solver是谷歌开源的C非线性优化库&#xff0c;能够解决有约束或无约束条件下的非线性最小二乘问题。2010年之后大量的运用在谷歌的产品开发中&#xff0c;尤其在谷歌开源的cartographer中…

[补题记录] Complete the Permutation(贪心、set)

URL&#xff1a;https://codeforces.com/group/OcmZ7weh45/contest/487583/problem/J 目录 Problem/题意 Thought/思路 Code/代码 Problem/题意 给出一个长度为 N 的序列&#xff0c;其中的元素都是奇数。 现在要求在两个奇数之间插入一个偶数&#xff0c;使得这三个数递增…

矩阵知识补充

正交矩阵 定义&#xff1a; 正交矩阵是一种满足 A T A E A^{T}AE ATAE的方阵 正交矩阵具有以下几个重要性质&#xff1a; A的逆等于A的转置&#xff0c;即 A − 1 A T A^{-1}A^{T} A−1AT**A的行列式的绝对值等于1&#xff0c;即 ∣ d e t ( A ) ∣ 1 |det(A)|1 ∣det(A)∣…

VPS配置了swap没发挥作用怎么办

1 swap配置了但没用上 我的服务器内存是2G&#xff0c;装多一点东西就不够用&#xff0c;于是我给他分配了2G的swap&#xff0c;等了几小时&#xff0c;swap还是一点都没有使用 Linux中Swap&#xff08;即&#xff1a;交换分区&#xff09;&#xff0c;类似于Windows的虚拟内存…

C++电脑组装项目(涉及知识点:多态)

需求&#xff1a; #include <iostream> #include "Computer.h" #include "AbstractCpu.h" #include "AbstractMemory.h" #include "AbstractVideoCard.h" #include "IntelCpu.h" #include "IntelMemory.h" …

【LeetCode刷题】--39.组合总和

39.组合总和 本题详解&#xff1a;回溯算法剪枝 class Solution {public List<List<Integer>> combinationSum(int[] candidates, int target) {int len candidates.length;List<List<Integer>> res new ArrayList<>();if (len 0) {return r…