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() {@Overridepublic 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(); // 阻塞当前线程,直到计时器的值为0System. 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个线程都在操作CountDownLatchSystem.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");}
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

matlab绘图函数plot和fplot的区别

一、背景 有的函数用plot画就会报错&#xff0c;显示数据必须为可转换为双精度值的数值、日期时间、持续时间、分类或数组。 如下图所示&#xff1a; 但用fplot函数就没有问题&#xff0c;因此这里记录一下两者的区别&#xff0c;如果使用不当&#xff0c;画出的图可能就是下…

游戏开发引擎Cocos Creator和Unity如何对接广告-AdSet聚合广告平台

在游戏开发方面&#xff0c;游戏引擎的选择对开发过程和最终的产品质量有着重大的影响&#xff0c;Unity和Cocos是目前全球两大商用、通用交互内容开发工具&#xff0c;这两款引擎受到广泛关注&#xff0c;本文将从多个维度对两者进行比较&#xff0c;为开发者提供正确的选择建…

利用Python进行数据分析【送书第六期:文末送书】

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; &#x1f40b; 希望大家多多支…

【算法之路】高精度算法(实现加减乘除)

目录 一、高精度概念 二、高精度算法的实现 1、高精度加法&#xff08;大整数相加&#xff09; 2、高精度减法&#xff08;大整数减法&#xff09; 3、高精度乘法&#xff08;大整数*小整数&#xff09; 4、高精度除法&#xff08;大整数/小整数&#xff09; 一、高精度概…

经典中的经典之字符串

前言&#xff1a;前段时间发烧了&#xff0c;所以耽误了很多事情&#xff0c;一直没有更新&#xff0c;多穿点衣服&#xff0c;感冒不好受。 接下来有时间就会陆续更新一些基础的算法题&#xff0c;题目都很经典&#xff0c;大家可以先尝试着做&#xff0c;再看 解析。 第一…

sql语法大全

1&#xff0c;创建数据库 create database 数据库名字; 2,查看所有的数据库名称 show databases; MySQL服务器已有4个数据库&#xff0c;这些数据库都是MySQL安装时自动创建的。 information_schema 和 performance_schema 数据库分别是 MySQL 服务器的数据字典&#xff08;…

LongAccumulator

原子操作之LongAccumulator 和LongAdder的区别在于&#xff0c;LongAdder是在Cell里面只能做加减操作&#xff0c;不能乘除&#xff0c;而LongAccumulator就可以定义乘除操作。原理和LongAdder都是一样的&#xff0c;一个Base和一个Cells数组。 原文跳转地址

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

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

RabbitMQ快速入门(简单收发消息)

文章目录 前言一、数据隔离1.用户管理2.virtual host 二、控制台收发1.交换机2.队列3.绑定 三、编程式收发1.依赖和配置2.收发信息 总结 前言 1.了解数据隔离 2.RabbitMQ控制台收发信息 3.SpringBoot整合RabbitMQ收发信息 一、数据隔离 1.用户管理 点击Admin选项卡&#xff0…

2023年危险化学品生产单位安全生产管理人员证模拟考试题库及危险化学品生产单位安全生产管理人员理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年危险化学品生产单位安全生产管理人员证模拟考试题库及危险化学品生产单位安全生产管理人员理论考试试题是由安全生产模拟考试一点通提供&#xff0c;危险化学品生产单位安全生产管理人员证模拟考试题库是根据危…

JMeter处理接口签名sign

写接口脚本的时候&#xff0c;很多接口涉及到签名&#xff0c;今天介绍下用JMeter编写签名脚本的方法。 举个例子&#xff0c;开启红包接口&#xff0c;请求方式为post POST /v1/api/red/open json请求参数 { "red_id":1, "timestamp":"1667033841…

Epub书籍阅读工具

Epub书籍阅读工具 前言WIndows总结Neat ReaderAquile ReaderWPS Android总结Neat Reader掌阅 前言 Epub文件为电子书文件格式&#xff0c;此格式的电子书相比txt书籍&#xff0c;增加了目录跳转功能&#xff0c;并可以显示图片。本文介绍WIndows和Android端的epub书籍阅读工具…