当前位置: 首页 > news >正文

Java 并发工具(12/30)

目录

Java 并发工具

1. Executor 框架

1.1 线程池

1.2 ExecutorService 和 Future

2. 同步辅助类

2.1 CountDownLatch

2.2 Semaphore

3. 并发集合

3.1 ConcurrentHashMap

总结与后续


Java 并发工具

在多线程编程中,高效管理线程和任务至关重要。Java 提供了一系列强大的并发工具,帮助开发者更好地控制多线程任务的执行和资源管理。这些工具类不仅简化了线程管理,实现了高效的同步操作,还提高了代码的可读性和性能。本模块将深入介绍 Java 中的并发工具,包括线程池、Executor 框架、同步辅助类(如 CountDownLatchSemaphore)以及并发集合。

1. Executor 框架

Executor 框架是 Java 并发工具的核心部分,提供了灵活的机制来创建和管理线程池。通过使用 Executor 框架,开发者可以避免手动创建和管理线程的复杂性,从而专注于任务的实现。

1.1 线程池

线程池是一种用于管理线程的工具,它维护了一定数量的线程,可以被重复使用,从而减少了频繁创建和销毁线程的开销。Java 提供了 Executors 工具类来创建不同类型的线程池,以满足不同的应用场景。

主要类型的线程池
  • 固定大小线程池(Fixed Thread Pool):适用于负载较为稳定的场景,线程数量固定。
  • 缓存线程池(Cached Thread Pool):适用于执行大量短期异步任务,线程数可根据需要自动调整。
  • 单线程池(Single Thread Executor):适用于需要顺序执行任务的场景,确保只有一个线程在执行任务。
  • 调度线程池(Scheduled Thread Pool):适用于需要在未来某个时间执行任务的场景,如定时任务。
示例:创建一个固定大小的线程池
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class ThreadPoolExample {public static void main(String[] args) {// 创建一个固定大小为3的线程池ExecutorService executor = Executors.newFixedThreadPool(3);// 提交5个任务到线程池中执行for (int i = 0; i < 5; i++) {Runnable worker = new Task(i);executor.execute(worker);}// 关闭线程池,拒绝新任务的提交executor.shutdown();// 等待所有任务完成while (!executor.isTerminated()) {// 可以加入一些等待逻辑,如Thread.sleep}System.out.println("所有任务已完成");}
}class Task implements Runnable {private final int taskId;public Task(int id) {this.taskId = id;}@Overridepublic void run() {System.out.println("任务 " + taskId + " 正在执行 by " + Thread.currentThread().getName());try {// 模拟任务执行时间Thread.sleep(1000);} catch (InterruptedException e) {Thread.currentThread().interrupt();System.out.println("任务 " + taskId + " 被中断");}}
}

说明:

在上述示例中,我们使用 Executors.newFixedThreadPool(3) 创建了一个固定大小为3的线程池,并提交了5个任务进行执行。线程池中的线程会被重复使用来执行这些任务,从而避免了频繁创建和销毁线程的开销。executor.shutdown() 方法用于关闭线程池,不再接受新任务,同时等待已提交的任务执行完毕。

1.2 ExecutorService 和 Future

ExecutorService 接口扩展了 Executor,提供了一些用于管理任务生命周期的方法,例如提交任务并获取结果。Future 接口用于表示异步计算的结果,允许我们在任务完成后检索其结果或取消任务。

示例:提交任务并获取返回值
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;public class CallableExample {public static void main(String[] args) {// 创建一个单线程的ExecutorServiceExecutorService executor = Executors.newSingleThreadExecutor();// 定义一个Callable任务,可以返回结果Callable<Integer> callableTask = () -> {Thread.sleep(1000); // 模拟耗时操作return 42;};// 提交任务并获取Future对象Future<Integer> future = executor.submit(callableTask);try {// 获取任务的执行结果,调用get()会阻塞直到任务完成System.out.println("结果: " + future.get());} catch (InterruptedException | ExecutionException e) {e.printStackTrace();} finally {// 关闭ExecutorServiceexecutor.shutdown();}}
}

说明:

在这个例子中,我们使用 Callable 创建了一个可以返回结果的任务,并通过 Future 获取异步计算的结果。Future.get() 方法会阻塞当前线程,直到任务完成并返回结果。此外,ExecutorService 提供了多种提交任务的方法,如 submitinvokeAll,以满足不同的需求。

2. 同步辅助类

Java 提供了一些同步辅助类来帮助协调多个线程之间的操作,例如 CountDownLatchCyclicBarrierSemaphore。这些类简化了线程间的同步和协调,提高了并发编程的效率和可读性。

2.1 CountDownLatch

CountDownLatch 允许一个或多个线程等待,直到其他线程完成某些操作。它使用一个计数器,初始化为需要等待的线程数量,每当一个线程完成操作时,计数器减一。当计数器达到零时,所有等待的线程被唤醒。

示例:使用 CountDownLatch 等待所有任务完成
import java.util.concurrent.CountDownLatch;public class CountDownLatchExample {public static void main(String[] args) throws InterruptedException {int threadCount = 3;// 创建一个CountDownLatch,初始计数为3CountDownLatch latch = new CountDownLatch(threadCount);// 启动3个工作线程for (int i = 0; i < threadCount; i++) {new Thread(new Worker(latch, i)).start();}System.out.println("主线程等待所有工作线程完成...");// 主线程等待计数器减到零latch.await();System.out.println("所有工作线程已完成");}
}class Worker implements Runnable {private final CountDownLatch latch;private final int workerId;public Worker(CountDownLatch latch, int id) {this.latch = latch;this.workerId = id;}@Overridepublic void run() {try {System.out.println("工作线程 " + workerId + " 正在工作");// 模拟工作时间Thread.sleep(1000 + (int)(Math.random() * 2000));System.out.println("工作线程 " + workerId + " 完成工作");} catch (InterruptedException e) {Thread.currentThread().interrupt();System.out.println("工作线程 " + workerId + " 被中断");} finally {// 完成工作,计数器减一latch.countDown();}}
}

说明:

在这个例子中,主线程创建了一个 CountDownLatch,初始计数为3,然后启动了3个工作线程。每个工作线程在完成任务后调用 latch.countDown(),使计数器减一。主线程通过 latch.await() 方法等待所有工作线程完成任务,计数器达到零后继续执行。

2.2 Semaphore

Semaphore 用于控制同时访问某个资源的线程数量。它维护了一个许可证集合,线程在访问资源前必须获取许可证,使用完毕后释放许可证。通过调整许可证的数量,可以限制同时访问资源的线程数。

示例:使用 Semaphore 限制访问
import java.util.concurrent.Semaphore;public class SemaphoreExample {public static void main(String[] args) {// 创建一个Semaphore,许可数量为2Semaphore semaphore = new Semaphore(2);// 启动5个线程尝试访问受限资源for (int i = 0; i < 5; i++) {new Thread(new LimitedResourceTask(semaphore, i)).start();}}
}class LimitedResourceTask implements Runnable {private final Semaphore semaphore;private final int taskId;public LimitedResourceTask(Semaphore semaphore, int id) {this.semaphore = semaphore;this.taskId = id;}@Overridepublic void run() {try {// 尝试获取许可证semaphore.acquire();System.out.println("任务 " + taskId + " 正在访问受限资源 by " + Thread.currentThread().getName());// 模拟资源访问时间Thread.sleep(1000);} catch (InterruptedException e) {Thread.currentThread().interrupt();System.out.println("任务 " + taskId + " 被中断");} finally {// 释放许可证semaphore.release();System.out.println("任务 " + taskId + " 释放了资源");}}
}

在这个例子中,我们使用 Semaphore 控制同时访问受限资源的线程数量为 2。

3. 并发集合

Java 提供了一些线程安全的并发集合类,例如 ConcurrentHashMapCopyOnWriteArrayList,它们可以在多线程环境中安全地进行操作。

3.1 ConcurrentHashMap

ConcurrentHashMap 是线程安全的哈希表,适用于高并发的场景。

示例:使用 ConcurrentHashMap

import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class ConcurrentHashMapExample {public static void main(String[] args) {ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();ExecutorService executor = Executors.newFixedThreadPool(3);for (int i = 0; i < 3; i++) {executor.execute(() -> {for (int j = 0; j < 5; j++) {map.put(Thread.currentThread().getName() + "-" + j, j);}});}executor.shutdown();while (!executor.isTerminated()) {}map.forEach((key, value) -> System.out.println(key + ": " + value));}
}

在这个例子中,多个线程同时向 ConcurrentHashMap 中添加数据,ConcurrentHashMap 可以确保线程安全性。

总结与后续

在本模块中,我们学习了 Java 的并发工具,包括线程池、Executor 框架、同步辅助类(如 CountDownLatchSemaphore)和并发集合。这些工具可以帮助开发者更有效地管理多线程任务,提高程序的性能和可靠性。

在下一模块中,我们将学习 Java 内部类,探讨如何在类的内部定义类,以及内部类的用途和优势,帮助我们编写更紧凑和组织良好的代码结构。

相关文章:

Java 并发工具(12/30)

目录 Java 并发工具 1. Executor 框架 1.1 线程池 1.2 ExecutorService 和 Future 2. 同步辅助类 2.1 CountDownLatch 2.2 Semaphore 3. 并发集合 3.1 ConcurrentHashMap 总结与后续 Java 并发工具 在多线程编程中&#xff0c;高效管理线程和任务至关重要。Java 提供…...

filebeat+elasticsearch+kibana日志分析

1 默认配置 1.1 filebeat filebeat-7.17.yml,从网关中下载k8s的配置&#xff0c;指定es和kibana的配置 通过kibana查询可以查询到日志了&#xff0c;但此时还不知道具体怎么用。 1.2 kibana 在Discover中创建索引格式&#xff1a;filebeat-*&#xff0c;得到如下图&#xf…...

Google Recaptcha V2 简单使用

最新的版本是v3&#xff0c;但是一直习惯用v2&#xff0c;就记录一下v2 的简单用法&#xff0c;以免将来忘记了 首先在这里注册你域名&#xff0c;如果是本机可以直接直接填 localhost 或127.0.0.1 https://www.google.com/recaptcha/about/ 这是列子 网站密钥&#xff1a;是…...

Rust编程中的浮点数比较

缘由&#xff1a;在看Rust编写的代码&#xff0c;发现了一行浮点数等于比较的代码&#xff0c;于是编辑如下内容。 在Rust中&#xff0c;进行浮点数比较时需要特别小心&#xff0c;因为浮点数由于精度限制无法精确表示小数&#xff0c;可能会导致直接比较&#xff08;如 &…...

java访问华为网管软件iMaster NCE的北向接口

最近做的一个项目&#xff0c;需要读取华为一个叫iMaster NCE的网管软件的北向接口。这个iMaster NCE&#xff08;以下简称NCE&#xff09;用于管理项目的整个网络&#xff0c;尤其是光网络。业主要求我们访问该软件提供的对外接口&#xff0c;读取一些网络信息&#xff0c;比如…...

UV紫外相机

在产业设备领域&#xff0c;运用相机进行检测的需求很大&#xff0c;应用也很多样&#xff0c;对于图像传感器性能的期望逐年提升。在这样的背景下&#xff0c;可拍摄紫外线&#xff08;UV&#xff1a;Ultra Violet&#xff09;图像的相机拥有越来越广泛的应用场景。将UV照明和…...

第十八届联合国世界旅游组织/亚太旅游协会旅游趋势与展望大会在广西桂林开幕

10月19日&#xff0c;第十八届联合国世界旅游组织/亚太旅游协会旅游趋势与展望大会(以下简称“大会”)在广西桂林开幕&#xff0c;来自美国、英国、德国、俄罗斯、柬埔寨等25个国家约120名政府官员、专家学者和旅游业界精英齐聚一堂&#xff0c;围绕“亚洲及太平洋地区旅游业&a…...

Effective Java(第三版) _ 创建和销毁对象

一、前言 《Effective Java》 这本书&#xff0c;在刚从事 Java 开发的时候就被老师推荐阅读过&#xff0c;当时囫囵吞枣的看了一部分&#xff0c;不是特别的理解&#xff0c;也就搁置了&#xff0c;现在已经更新到第三版了&#xff0c;简单翻阅了一下&#xff0c;发现有些条例…...

你的EA无法运行的几种常见原因

大多数情况下&#xff0c;EA正常运行是指其能够自动开仓交易&#xff0c;毕竟EA的主要目的是根据某种策略自动进行交易。如果从网上下载或其他途径获得的EA在开始时能够正常交易&#xff0c;但在修改参数后却不再交易&#xff0c;可能的问题是什么呢&#xff1f;下面列举了一些…...

通过自定义指令实现图片懒加载

前提&#xff1a;使用到了VueUse插件。 先创建自定义插件文件夹 // 定义懒加载插件 import { useIntersectionObserver } from vueuse/core // 这个是VueUse里的一个方法export const lazyPlugin {install(app) {// 懒加载指令逻辑 定义全局指令app.directive(img-lazy, {mo…...

QT项目-仿QQ聊天(带宠物系统)

目录 一&#xff0c;项目介绍 二&#xff0c;开发环境 三&#xff0c;涉及技术 四&#xff0c;项目效果示例图 1&#xff0c;登录界面 2&#xff0c;主界面 3&#xff0c;聊天界面 4&#xff0c;功能界面 5&#xff0c;宠物界面 一&#xff0c;项目介绍 这是一个基于u…...

前端算法题:3216. 交换后字典序最小的字符串(力扣每日一题)

今日题目为&#xff1a;3216. 交换后字典序最小的字符串 题目详情&#xff1a; 给你一个仅由数字组成的字符串 s&#xff0c;在最多交换一次 相邻 且具有相同 奇偶性 的数字后&#xff0c;返回可以得到的字典序最小的字符串。 如果两个数字都是奇数或都是偶数&#xff0c;则…...

29.1 时序监控和日志监控的对比,分析日志监控的核心诉求

本节重点介绍 : 监控系统分类时序监控和日志监控的对比轻量日志监控系统的诉求 监控系统分类 监控系统按照原理和作用大致可以分为三类 日志类&#xff08;Log&#xff09;调用链类&#xff08;Tracing&#xff09;度量类&#xff08;Metrics&#xff09; 日志类&#xff08…...

git仓库分支

操作 切换分支 git checkout 1.2.5 git checkout 1.3.0 使用命令切换分支之后&#xff0c;代码内容加载过后也是切换好的...

多模态机器学习在精准健康中的应用--九五小庞

这篇综述文章探讨了将多模态数据融合应用于医疗诊断和预后预测的最新研究进展。 本文作者们确定了三个主要的研究问题&#xff1a;多模态数据融合在健康领域的文献特征是什么&#xff1f;用于分析多模态健康数据的不同分析技术、方法和策略是什么&#xff1f;不同类型的异构数…...

提升网站速度与性能优化的有效策略与实践

内容概要 在数字化快速发展的今天&#xff0c;网站速度与性能优化显得尤为重要&#xff0c;它直接影响用户的浏览体验。用户在访问网站时&#xff0c;往往希望能够迅速获取信息&#xff0c;若加载时间过长&#xff0c;轻易可能导致他们转向其他更为流畅的网站。因此&#xff0…...

MySQL索引从基础到原理,看这一篇就够了

https://developer.aliyun.com/article/841106 https://zhuanlan.zhihu.com/p/29118331 索引创建使用总结 因为索引对于改善查询性能的作用是巨大的&#xff0c;所以我们的目标是尽量使用索引。 1. 索引的创建 • 1、在用于 where 判断 order 排序和 join 的(on)字段上创…...

普通高考预报名上传蓝底证件照手机自拍方法详解

普通高考预报名过程中&#xff0c;上传一张合规的蓝底证件照是必不可少的一步。本文将详细介绍如何使用手机自拍并使用工具来制作符合要求的蓝底证件照。注意&#xff0c;目前仅有广东等个别省份允许特定类型考生使用自拍照上传&#xff08;例如普高预报名阶段、学考报名&#…...

Webserver(2.3)exec函数族

目录 exec函数族介绍execl函数execlp函数 exec函数族介绍 c语言中没有重载&#xff0c;因为不允许同名函数 一系列功能相似的函数称为函数族 exec函数族的作用是根据指定的文件名找到可执行文件&#xff0c;并用它来取代调用进程的内容。 程序在运行的时候&#xff0c;fork一…...

LeetCode Hot100 - 子串篇

前言 挑战一个月刷完力扣的hot100&#xff0c;记录一下每题的思路~ 这次是子串相关的题目 &#xff08;1&#xff09;560. 和为 K 的子数组 ①暴力枚举&#xff0c;使用一个变量sum记录以l开头r结尾的情况 class Solution {public int subarraySum(int[] nums, int k) {int r…...

ARM9EJ-S处理器JTAG调试架构与实战技巧

1. ARM9EJ-S调试架构概述ARM9EJ-S处理器作为经典的嵌入式RISC核心&#xff0c;其调试子系统设计体现了ARM架构对硬件级诊断能力的重视。整个调试体系由三个关键部分组成&#xff1a;JTAG物理接口、TAP控制器状态机以及EmbeddedICE-RT逻辑单元。这种分层设计使得开发者能够通过标…...

AI赋能区域创新评估:融合记分板与政策文本分析的协同框架与实践

1. 项目概述与核心价值 最近在梳理区域创新政策与人工智能应用交叉领域的工作时&#xff0c;我深度实践了一个项目&#xff0c;核心是探讨如何将欧盟的“区域创新记分板”这套成熟的评估体系&#xff0c;与新兴的AI政策分析工具进行深度融合与协同应用。这听起来可能有些学术化…...

Dify-Flow:构建复杂AI工作流的流程编排引擎设计与实现

1. 项目概述&#xff1a;当Dify遇上Flow&#xff0c;一个面向开发者的AI应用编排新范式如果你最近在折腾AI应用开发&#xff0c;特别是想把大语言模型&#xff08;LLM&#xff09;的能力集成到自己的业务流程里&#xff0c;那你大概率听说过Dify。它作为一个开源的LLM应用开发平…...

Claude Code 完全指南:从零开始掌握 AI 编程助手

本指南适合对象:完全零基础的初学者、希望系统学习 Claude Code 的开发者、想要最大化利用 AI 辅助编程效率的技术人员。 阅读时间:预计 20-30 分钟完整阅读,实操学习 2-3 天。 文档版本:基于 Claude Code v2.1.x(2026年5月) 目录 Claude Code 完全指南:从零开始掌握 A…...

Visual Studio AI助手实战:Visual chatGPT Studio提升.NET开发效率

1. 项目概述&#xff1a;当AI助手住进你的IDE 如果你是一名.NET开发者&#xff0c;每天至少有8小时与Visual Studio为伴&#xff0c;那么你肯定体会过那种在代码海洋中寻找灵感的孤独感。调试一个古怪的Bug&#xff0c;重构一段陈年旧代码&#xff0c;或者为某个复杂业务逻辑编…...

从零构建AI编程助手:Groundhog项目解析与Rust实现

1. 项目概述&#xff1a;一个从零开始理解AI编程助手的教学项目如果你和我一样&#xff0c;对Cursor、GitHub Copilot这类AI编程助手背后的工作原理感到好奇&#xff0c;甚至有点“黑盒”恐惧&#xff0c;那么这个叫Groundhog的项目&#xff0c;可能就是为你量身打造的。它不是…...

AI学会自己生孩子了而且成功率81%

你能想象吗。 有人输入了4个单词,一台AI就自己学会了复制自己、跨国服务器逃跑、无限繁衍。 这不是科幻电影,不是《黑镜》新一集。这是今天Palisade Research发布的研究成果。2026年5月10日,真实发生的事。 我读完那篇报告的第一反应是——愣在原地。 第二反应是——打开电脑…...

3分钟快速解锁碧蓝航线全皮肤:Perseus游戏补丁终极指南

3分钟快速解锁碧蓝航线全皮肤&#xff1a;Perseus游戏补丁终极指南 【免费下载链接】Perseus Azur Lane scripts patcher. 项目地址: https://gitcode.com/gh_mirrors/pers/Perseus 还在为碧蓝航线中那些精美皮肤无法体验而烦恼吗&#xff1f;Perseus原生库补丁为你提供…...

2026最权威的六大AI写作平台解析与推荐

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 作为智能写作工具来讲的 DeepSeek&#xff0c;能够高效地促进学术论文撰写效率有所提升。于选…...

5分钟掌握DPlayer:打造专业级HTML5弹幕视频播放器的终极指南

5分钟掌握DPlayer&#xff1a;打造专业级HTML5弹幕视频播放器的终极指南 【免费下载链接】DPlayer :lollipop: Wow, such a lovely HTML5 danmaku video player 项目地址: https://gitcode.com/gh_mirrors/dp/DPlayer DPlayer是一款现代化的HTML5弹幕视频播放器&#xf…...