JavaEE 第15节 JUC相关组件介绍

news2025/1/13 15:52:38

目录

前言:

Callable 

ReentrantLock

Semaphore

CountDownLatch


前言:

在Java中,JUC(包路径:java.util.concurrent)是一个用于并发编程的包,提供了线程安全的集合类、同步工具、并发执行框架和原子变量等,以简化和增强多线程编程的性能和可靠性。接下来介绍的这几个组件使用起来都比较简单。


Callable 

Callable是一个接口,你可以理解成它是一个带有返回值的Runnable。

如图,Runnable和Callable的创建对比:

Thread类没有关于Callable的构造方法。原因在于需要通过Callable的实例创建FutureTask的实例才行:

public class CallableTest {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
   

        Callable<Integer> callable=new Callable<Integer>() {
            @Override
            public Integer call() throws Exception {
                System.out.println("hehhe");
                return 10;
            }
        };

        /**在创建线程的时候,多出了创建FutureTask的对象这一步*/
        FutureTask<Integer> futureTask=new FutureTask<>(callable);

        Thread thread=new Thread(futureTask);
        thread.start();
        thread.join();

        /*get方法可以获取到返回值*/
        int ret=futureTask.get();
        System.out.println("thread:"+ret);
    }
}

FutureTask是一个类,它的get方法可以获取call方法的返回值。

执行结果:

hehhe
thread:10


ReentrantLock

除了synchronized,Java标准库开提供了其他方式对线程进行加锁的操作。

比如:Excuters(第10节线程池讲过)、Semaphore(等一下会讲)、ReentrantLock(当前正题)等。

ReentrantLock是一个类(需要创建对象使用),与synchronized对比,ReentrantLock的区别:

  • 加锁方式:需要用到lock()/unlock()来上锁解锁,因此为了避免死锁,最好把unlock()放到finally块中。
  • tryLock:ReentrantLock提供了tryLock(),调用此方法,如果加锁失败,当前线程不会进入阻塞状态,而是直接返回,执行别的任务。
  • 公平锁:ReentrantLock默认是不公平锁,不过可以在使用构造方法的时候设置成公平锁。
  • 更精确的通知:ReentrantLock实现了Condition接口,在这个接口中,提供了一组方法,可以精确的唤醒某个满足特定条件的线程。而synchronized只能随机或全部唤醒。

Semaphore

Semaphore是计算机的一个专业术语,意为“信号量”。

它是一个控制资源访问的同步类工具。它可以限制同时访问某一个特定资源的总线程数量,保证多个线程可以有序的访问共享资源。

举个形象的例子:

在停车场的入口,我们通常会看到这个显示剩余车位的指示牌:

Semaphore就可以类比成这个指示牌。用了这个指示牌,外面的车子就不会无脑的开进去,在车位满了的时候就不会出现拥堵。

Semaphore的使用方式:

public class SemaphoreTest {

    public static void main(String[] args) {
        Semaphore semaphore=new Semaphore(4);
        
        for (int i = 0; i <20 ; i++) {
            int id=i;
            Thread t=new Thread(()->{
                try {
                    System.out.println("申请资源");
                    semaphore.acquire();//申请资源的方法
                    System.out.println("执行任务:"+id);
                    System.out.println("释放资源");
                    semaphore.release();//释放资源的方法

                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
            t.start();
        }
    }
}

如果Semaphore构造方法的参数设置成1,那么它就变成了一个加锁操作,一个线程在完成了任务后,其他线程才可以继续执行。

CountDownLatch

CountDownLatch是JUC中的一个同步辅助类,用它的构造方法可以设置一个任务数量,每次执行完一个任务,可以调用它自带的contDown()方法任务计数器会-1。当任务计数器为0的时候,可以唤醒其他线程(调用了CountDownLatch类的'await()'方法的线程,这个方法可以让调用它的线程进入睡眠直到任务计数器减为0)。

代码演示:

public class JUCcountDown {

    public static void main(String[] args) throws InterruptedException {
        ExecutorService service= Executors.newFixedThreadPool(4);
        CountDownLatch latch=new CountDownLatch(20);

        for (int i = 0; i <20 ; i++) {
            int id=i;
            service.submit(()->{
                System.out.println("执行任务:"+id);
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("任务:"+id+"执行完毕");
                latch.countDown();//计数器-1
            });
        }

        //主线程进入睡眠,计数器为0才会苏醒
        latch.await();

        System.out.println("所有任务执行完毕!");
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OSPF配置学习笔记

1.OSPF基础配置命令 1.1&#xff08;系统视图&#xff09;创建并运行OSPF进程 [Huawei] ospf [ process-id | router-id router-id ] porcess-id用于标识OSPF进程&#xff0c;默认进程号为1。OSPF支持多进程&#xff0c;在同一台设备上可以运行多个不同的OSPF进程&#xff0…

[000-01-022].第09节:RabbitMQ中的消息分发策略

我的后端学习大纲 RabbitMQ学习大纲 1.不公平分发&#xff1a; 1.1.什么是不公平分发&#xff1a; 1.在最开始的时候我们学习到 RabbitMQ 分发消息采用的轮训分发&#xff0c;但在某种场景下这种策略并不是很好&#xff0c;比方说有两个消费者在处理任务&#xff0c;其中有个…

【机器学习】联邦学习技术

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 文章目录 引言联邦学习的定义与原理联邦学习的用例联邦学习示例与代码 引言 在大数据时代&#xff0c;数据隐私和安全成为了一个日益重要的议题。传统的机器学习模型训练通常需要集中大量数据到一个中心服务器…

【自然语言处理】 构建文本对话系统

构建文本对话系统的框架如下&#xff1a; 根据聊天系统目的功用的不同&#xff0c;可分成三大类型&#xff1a; 闲聊式机器人&#xff1a;较有代表性的有微软小冰、微软小娜、苹果的 Siri、小 i 机器人等&#xff0c;主要以娱乐为目的。 **知识问答型机器人&#xff1a;**知识…

Linux别名与用户管理体系

一、别名 1、概述 别名&#xff0c;给命令进行设置 一般用于给命令设置一个昵称/爱称 主要应用场景: 给常用命令设置个快捷方式&#xff0c;使用简单方便给危险命令加上的防护措施 查看系统已有的别名 [rootyunwei ~]# alias alias cpcp -i alias egrepegrep --coloraut…

[alien Invasion]python小游戏阶段总结

以后可能还会进行代码重构&#xff0c;以最终版本为准 本篇文章旨在理清程序脉络&#xff0c;方便以后写类似的程序时提供一个习惯的思路 未经允许&#xff0c;禁止转载 实体区 ship.py import pygame class Ship():def __init__(self,screen,ai_settings):#储存以便后续使…

RocketMQ广播模式消费失败是否会重试?

文章目录 前言继续广播和集群模式的消费流程集群模式&#xff08;默认的&#xff09;广播模式小结 push和pull介绍源码展示 偏移量保存失败情况1. 网络问题2. Consumer本地问题3. 消费进度记录器问题4. 程序设计问题5. 异常终止6. 持久化策略问题7. 同步问题 源码解析OffsetSto…

亚马逊测评号生存法则:如何抵御亚马逊封号风波?

距离黑五购物狂欢节还剩99天&#xff0c;相信各位商家都在紧锣密鼓的筹备相关事宜&#xff0c;然而&#xff0c;亚马逊的封号风波再次席卷而来。那如何在这场风暴中让亚马逊矩阵测评号安全航行亦或是脱颖而出呢&#xff1f;本文将给你一个答案&#xff0c;并帮助你的亚马逊店铺…

【PyTorch快速入门教程】03 PyTorch基础知识

在PyTorch中&#xff0c;最小的计算单元是张量&#xff08;tensor&#xff09;。因此关于张量的学习还是至关重要的。通过本章节学习&#xff0c;希望你对张量有一个更清晰的了解。 文章目录 1 什么是Tensor2 PyTorch中Tensor使用2.1 创建Tensor2.1.1 直接创建Tensor2.1.2 间接…

anaconda上安装pytorch

1、选择anaconda prompt 2、创建虚拟环境 3、激活进入虚拟环境 4、安装pytorch 怎么得到上面的这串命令&#xff1f; 输入nvidia-smi&#xff0c;查看cuda的版本号为11.7 我这里选择安装cuda的版本号为11.3&#xff0c;满足向下兼容即可。 在安装深度学习环境时&#xff0c;要…

探索《黑神话·悟空》背后的AI技术支持:英伟达全景光线追踪技术、DLSS 3.5 与帧生成

引言 2023 年&#xff0c;游戏《黑神话悟空》以其震撼的视觉效果和深度沉浸的游戏体验&#xff0c;成为全球玩家热议的焦点。这款游戏在发布初期就取得了惊人的销量&#xff1a;预售阶段便突破 120 万套&#xff0c;而发售首日更是达到 450 万份的惊人成绩。这个现象级作品背后…

走进 “星星的孩子” 的世界:理解与关爱儿童自闭症

在这个充满生机与活力的世界里&#xff0c;有一群特殊的孩子&#xff0c;他们仿佛来自遥远的星球&#xff0c;沉浸在自己的独特世界中&#xff0c;难以与外界进行有效的沟通和互动。他们是自闭症儿童&#xff0c;也被称为 “星星的孩子”。 自闭症&#xff0c;又称孤独症谱系障…

Linux 软件编程 数据库

1. 大批量数据存储和管理时使用数据库 2.创建表 create table 表名称(列1 数据类型, 列2 数据类型, ...); 3.插入表 insert into 表名称 values(值1, 值2, ...); 4.查看表 select 列1,列2,... from 表名称 where 匹配条件 order by 列名称 asc/desc; 5.删除表 delete from …

种田RPG游戏(五)

一、重新设置物品栏 1、打开Scripts-Inventory文件新建 ItemSlotData.cs using System.Collections; using System.Collections.Generic; using UnityEngine;[System.Serializable] //单独的类 public class ItemSlotData {public ItemData itemData;//ItemData对象&#xff…

Java 入门指南:Queue 接口

Collection 接口 Collection 接口提供了一系列用于操作和管理集合的方法&#xff0c;包括添加、删除、查询、遍历等。它是所有集合类的根接口&#xff0c;包括 List、Set、Queue 等。 Collection 接口常见方法 add(E element)&#xff1a;向集合中添加元素。 addAll(Collecti…

大模型笔记之-XTuner微调个人小助手认知

前言 使用XTuner 微调个人小助手认知 一、下载模型 #安装魔搭依赖包 pip install modelscope新建download.py内容如下 其中Shanghai_AI_Laboratory/internlm2-chat-1_8b是魔搭对应的模型ID cache_dir/home/aistudio/data/model’为指定下载到本地的目录 from modelscope im…

Stable Diffusion的微调方法原理总结

目录 1、Textural Inversion&#xff08;简易&#xff09; 2、DreamBooth&#xff08;完整&#xff09; 3、LoRA&#xff08;灵巧&#xff09; 4、ControlNet&#xff08;彻底&#xff09; 5、其他 1、Textural Inversion&#xff08;简易&#xff09; 不改变网络结构&…

Ciallo~(∠・ω・ )⌒☆第二十五篇 Redis

Redis 是一个高性能的键值存储数据库&#xff0c;它能够在内存中快速读写数据&#xff0c;并且支持持久化到磁盘。它被广泛应用于缓存、队列、实时分析等场景。 一、启动redis服务器 要打开redis服务器&#xff0c;需要在终端中输入redis-server命令。确保已经安装了redis&…

【Java】/* 链式队列 和 循环队列 - 底层实现 */

一、链式队列 1. 使用双向链表实现队列&#xff0c;可以采用尾入&#xff0c;头出 也可以采用 头入、尾出 (LinkedList采用尾入、头出) 2. 下面代码实现的是尾入、头出&#xff1a; package bageight;/*** Created with IntelliJ IDEA.* Description:* User: tangyuxiu* Date: …

mOTA v2.0

mOTA v2.0 一、简介 本开源工程是一款专为 32 位 MCU 开发的 OTA 组件&#xff0c;组件包含了 bootloader 、固件打包器 (Firmware_Packager) 、固件发送器 三部分&#xff0c;并提供了基于多款 MCU (STM32F1 / STM32F407 / STM32F411 / STM32L4) 和 YModem-1K 协议的案例。基…