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

高薪程序员必修课-java为什么要用并发编程

目录

前言

1. 提高性能和效率

2. 更好地响应用户

3. 优化I/O操作

具体示例

示例1:提高性能和效率

示例2:更好地响应用户

示例3:优化I/O操作

总结


前言

        并发编程允许多个线程在同一时间执行任务。下面我们从多个原理角度来解释为什么Java需要并发编程,并提供适当的示例。

1. 提高性能和效率
  • 原理:在多核处理器上,并发编程可以让程序利用多个CPU核同时运行多个任务,从而提高整体性能。
  • 示例:处理大量数据时,可以将数据分成多个部分,并行处理每个部分。
2. 更好地响应用户
  • 原理:在GUI应用程序中,并发编程允许用户界面线程保持响应,同时其他线程处理后台任务。
  • 示例:在一个图形界面应用中,用户可以在后台执行文件下载的同时,继续使用界面而不冻结。
3. 优化I/O操作
  • 原理:I/O操作(如文件读写、网络通信)通常是阻塞的。使用并发编程,可以在等待I/O操作完成时执行其他任务。
  • 示例:一个服务器程序可以使用多个线程同时处理多个客户端请求。

具体示例

示例1:提高性能和效率

假设我们需要对一个大型数组进行求和操作,可以将数组分成多个部分并行处理:

public class ParallelSum {private static final int THREAD_COUNT = 4;public static void main(String[] args) throws InterruptedException {int[] array = new int[1000000];// 初始化数组for (int i = 0; i < array.length; i++) {array[i] = i + 1;}// 创建并启动线程SumThread[] threads = new SumThread[THREAD_COUNT];int length = array.length / THREAD_COUNT;for (int i = 0; i < THREAD_COUNT; i++) {threads[i] = new SumThread(array, i * length, (i + 1) * length);threads[i].start();}// 等待所有线程完成int totalSum = 0;for (SumThread thread : threads) {thread.join();totalSum += thread.getSum();}System.out.println("Total sum: " + totalSum);}
}class SumThread extends Thread {private int[] array;private int start;private int end;private int sum;public SumThread(int[] array, int start, int end) {this.array = array;this.start = start;this.end = end;}public void run() {sum = 0;for (int i = start; i < end; i++) {sum += array[i];}}public int getSum() {return sum;}
}
示例2:更好地响应用户

在一个GUI应用程序中,通过使用SwingWorker来执行耗时任务,使界面保持响应:

import javax.swing.*;
import java.awt.*;public class ResponsiveUI {public static void main(String[] args) {JFrame frame = new JFrame("Responsive UI");frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setSize(400, 200);frame.setLayout(new FlowLayout());JButton button = new JButton("Start Task");JLabel label = new JLabel("Task not started");frame.add(button);frame.add(label);button.addActionListener(e -> {SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() {@Overrideprotected Void doInBackground() {// 模拟长时间任务try {Thread.sleep(5000);} catch (InterruptedException interruptedException) {interruptedException.printStackTrace();}return null;}@Overrideprotected void done() {label.setText("Task completed");}};worker.execute();label.setText("Task started");});frame.setVisible(true);}
}
示例3:优化I/O操作

在一个服务器程序中,使用多线程处理多个客户端连接:

import javax.swing.*;
import java.awt.*;public class ResponsiveUI {public static void main(String[] args) {JFrame frame = new JFrame("Responsive UI");frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setSize(400, 200);frame.setLayout(new FlowLayout());JButton button = new JButton("Start Task");JLabel label = new JLabel("Task not started");frame.add(button);frame.add(label);button.addActionListener(e -> {SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() {@Overrideprotected Void doInBackground() {// 模拟长时间任务try {Thread.sleep(5000);} catch (InterruptedException interruptedException) {interruptedException.printStackTrace();}return null;}@Overrideprotected void done() {label.setText("Task completed");}};worker.execute();label.setText("Task started");});frame.setVisible(true);}
}

总结

并发编程在Java中有以下几个主要原因:

  1. 提高性能和效率,通过充分利用多核处理器。
  2. 保持用户界面响应,提高用户体验。
  3. 优化I/O操作,避免等待时间浪费。

通过这些示例,可以更好地理解为什么Java中需要使用并发编程,以及如何使用并发编程提高应用程序的性能和响应能力。

相关文章:

高薪程序员必修课-java为什么要用并发编程

目录 前言 1. 提高性能和效率 2. 更好地响应用户 3. 优化I/O操作 具体示例 示例1&#xff1a;提高性能和效率 示例2&#xff1a;更好地响应用户 示例3&#xff1a;优化I/O操作 总结 前言 并发编程允许多个线程在同一时间执行任务。下面我们从多个原理角度来解释为什么J…...

postgreSQL学习

postgreSql学习 学习参考&#xff1a;1、命令1.1 登录1.2 关闭连接 2、常用数据类型2.1 数值类型2.2 字符串类型2.3 时间2.4 其他 3、自增主键4、sql4.1 库操作&#xff08;1&#xff09;创建新库&#xff08;2&#xff09;切换数据库&#xff08;3&#xff09;删库【谨慎&…...

【3】系统标定

文章目录 雷达标定相机主雷达标定底盘动力学标定车辆循迹验证建图 雷达标定 主要是为了获得到lidar到imu的tf关系。imu为父坐标lidar为子坐标。其他雷达标定到主lidar坐标系下。 标定的结果都是生成一个是四元数。 #mermaid-svg-crOWRnT4UE0jtJVy {font-family:"trebuch…...

网安小贴士(3)网安协议

一、前言 网络安全协议是构建安全网络环境的基础&#xff0c;它们帮助保护网络通信免受各种威胁和攻击。 二、定义 网络安全协议是指在计算机网络中用于确保网络通信和数据传输安全的协议。它们定义了在网络通信过程中的安全机制、加密算法、认证和授权流程等&#xff0c;以保…...

大数据面试题之HBase(1)

目录 介绍下HBase HBase优缺点 说下HBase原理 介绍下HBase架构 HBase读写数据流程 HBase的读写缓存 在删除HBase中的一个数据的时候&#xff0c;它什么时候真正的进行删除呢?当你进行删除操作&#xff0c;它是立马就把数据删除掉了吗? HBase中的二级索引 HBa…...

git回退commit的方式

在Git中&#xff0c;回退commit&#xff08;即撤销之前的提交&#xff09;可以通过多种方式来实现。以下是一些常见的方法&#xff0c;以及它们的详细步骤和注意事项&#xff1a; ### 1. 使用git revert命令 git revert命令用于撤销某次commit&#xff0c;但它并不会删除该comm…...

[Information Sciences 2023]用于假新闻检测的相似性感知多模态提示学习

推荐的一个视频&#xff1a;p-tuning P-tunning直接使用连续空间搜索 做法就是直接将在自然语言中存在的词直接替换成可以直接训练的输入向量。本身的Pretrained LLMs 可以Fine-Tuning也可以不做。 这篇论文也解释了为什么很少在其他领域结合知识图谱的原因&#xff1a;就是因…...

自定义vue3 hooks

文章目录 hooks目录结构demo hooks 当页面内有很多的功能&#xff0c;js代码太多&#xff0c;不好维护&#xff0c;可以每个功能都有写一个js或者ts&#xff0c;这样的话&#xff0c;代码易读&#xff0c;并且容易维护&#xff0c;组合式setup写法与此结合&#x1f44d;&#…...

《昇思25天学习打卡营第21天 | 昇思MindSporePix2Pix实现图像转换》

21天 本节学习了通过Pix2Pix实现图像转换。 Pix2Pix是基于条件生成对抗网络&#xff08;cGAN&#xff09;实现的一种深度学习图像转换模型。可以实现语义/标签到真实图片、灰度图到彩色图、航空图到地图、白天到黑夜、线稿图到实物图的转换。Pix2Pix是将cGAN应用于有监督的图…...

【文档+源码+调试讲解】科研经费管理系统

目 录 目 录 摘 要 ABSTRACT 1 绪论 1.1 课题背景 1.2 研究现状 1.3 研究内容 2 系统开发环境 2.1 vue技术 2.2 JAVA技术 2.3 MYSQL数据库 2.4 B/S结构 2.5 SSM框架技术 3 系统分析 3.1 可行性分析 3.1.1 技术可行性 3.1.2 操作可行性 3.1.3 经济可行性 3.1…...

linux 下 rm 为什么要这么写?

下面代码中的rm 为什么要写成/bin/rm? 大文件清理&#xff0c;高宿主含量样本可节约>90%空间/bin/rm -rf temp/qc/*contam* temp/qc/*unmatched* temp/qc/*.fqls -l temp/qc/ 这是一个很好的问题&#xff0c;观察很仔细, 也带着了自己的思考。 rm是 Linux 下的一个危险…...

【Spring Boot】Spring AOP中的环绕通知

目录 一、什么是AOP?二、AOP 的环绕通知2.1 切点以及切点表达式2.2 连接点2.3 通知&#xff08;Advice&#xff09;2.4 切面(Aspect)2.5 不同通知类型的区别2.5.1 正常情况下2.5.2异常情况下 2.6 统一管理切点PointCut 一、什么是AOP? Aspect Oriented Programming&#xff…...

docker部署前端,配置域名和ssl

之前使用80端口部署前端项目后&#xff0c;可以使用IP端口号在公网访问到部署的项目。 进行ICP域名备案后&#xff0c;可以通过域名解析将IP套壳&#xff0c;访问域名直接访问到部署的项目~ 如果使用http协议可以很容易实现这个需求&#xff0c;对nginx.conf文件进行修改&#…...

初学Spring之 IOC 控制反转

Spring 是一个轻量级的控制反转&#xff08;IOC&#xff09;和面向切面编程&#xff08;AOP&#xff09;的框架 导入 jar 包&#xff1a;spring-webmvc、spring-jdbc <dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc&…...

rpc的仅有通信的功能,在网断的情况下,比网通情况下,内存增长会是什么原因

RPC&#xff08;Remote Procedure Call&#xff0c;远程过程调用&#xff09;主要负责在分布式系统中透明地调用远程服务&#xff0c;就像调用本地函数一样。它封装了网络通信的细节&#xff0c;使得开发者可以专注于业务逻辑而非底层通信协议。RPC通信通常包括序列化、网络传输…...

从零开始:如何设计一个现代化聊天系统

写在前面: 此博客内容已经同步到我的博客网站,如需要获得更优的阅读体验请前往https://mainjaylai.github.io/Blog/blog/system/chat-system 在当今数字化时代,聊天系统已成为我们日常生活和工作中不可或缺的一部分。从个人交流到团队协作,从客户服务到社交网络,聊天应用…...

香橙派OrangePi AIpro初体验:当小白拿到一块开发板第一时间会做什么?

文章目录 香橙派OrangePi AIpro初体验&#xff1a;当小白拿到一块高性能AI开发板第一时间会做什么前言一、香橙派OrangePi AIpro概述1.简介2.引脚图开箱图片 二、使用体验1.基础操作2.软件工具分析 三、香橙派OrangePi AIpro.测试Demo1.测试Demo1&#xff1a;录音和播音(USB接口…...

【C语言内存函数】

目录 1.memcpy 使用 模拟实现 2.memmove 使用 模拟实现 3.memset 使用 4.memcmp 使用 1.memcpy 使用 void * memcpy ( void * destination, const void * source, size_t num );目的地址 源地址 字节数 destination&#xff1a;指向要复制内…...

Mysql部署MHA高可用

部署前准备&#xff1a; mysql-8.0.27下载地址&#xff1a;https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.27-1.el7.x86_64.rpm-bundle.tar mha-manager下载地址&#xff1a;https://github.com/yoshinorim/mha4mysql-manager/releases/download/v0.58/mha4mysql-mana…...

【算法学习】射线法判断点在多边形内外(C#)以及确定内外两点连线与边界的交点

1.前言&#xff1a; 在GIS开发中&#xff0c;经常会遇到确定一个坐标点是否在一块区域的内部这一问题。 如果这个问题不是一个单纯的数学问题&#xff0c;例如&#xff1a;在判断DEM、二维图像像素点、3D点云点等含有自身特征信息的这些点是否在一个区域范围内部的时候&#x…...

HunyuanVideo-Foley镜像免配置:预置ffmpeg滤镜链实现音效风格化处理

HunyuanVideo-Foley镜像免配置&#xff1a;预置ffmpeg滤镜链实现音效风格化处理 1. 镜像概述与核心优势 HunyuanVideo-Foley私有部署镜像是一款专为视频与音效生成任务优化的解决方案&#xff0c;基于RTX 4090D 24GB显存和CUDA 12.4深度调优。这个镜像的最大特点是开箱即用的…...

LoRa Feather固件设计:ESP32-S3多外设协同与低功耗调度

1. 项目概述“LoRa Feather”并非一个官方发布的标准化嵌入式库&#xff0c;而是由开发者基于 Adafruit LoRa FeatherWing&#xff08;如 RFM95W/RFM96W 模块&#xff09;与 ESP32-S3&#xff08;特别是带 TFT 显示屏的 Adafruit Feather ESP32-S3 Reverse&#xff09;硬件平台…...

ROS2编译报错CMake未找到diagnostic_updater:从诊断工具缺失到精准安装

1. 当CMake告诉你找不到diagnostic_updater时发生了什么 第一次看到这个报错的时候&#xff0c;我也是一头雾水。明明代码是从GitHub上clone下来的标准功能包&#xff0c;怎么一编译就报错呢&#xff1f;那个红色的"CMake Error"特别扎眼&#xff0c;就像开车时突然亮…...

4步解决RetroArch缩略图显示异常,恢复游戏库视觉体验

4步解决RetroArch缩略图显示异常&#xff0c;恢复游戏库视觉体验 【免费下载链接】RetroArch Cross-platform, sophisticated frontend for the libretro API. Licensed GPLv3. 项目地址: https://gitcode.com/GitHub_Trending/re/RetroArch 在RetroArch的使用过程中&am…...

OpenFOAM字典文件关键配置实战指南

1. OpenFOAM字典文件基础认知 第一次接触OpenFOAM的朋友&#xff0c;看到满屏幕的字典文件可能会有点懵。这玩意儿就像乐高积木的说明书&#xff0c;告诉你每个零件该怎么拼。我刚开始用的时候&#xff0c;经常把blockMeshDict和snappyHexMeshDict搞混&#xff0c;结果生成的网…...

保姆级教程:手把手教你用Python+Control库仿真PLL噪声传递函数

保姆级教程&#xff1a;手把手教你用PythonControl库仿真PLL噪声传递函数 锁相环&#xff08;PLL&#xff09;作为现代电子系统中的核心组件&#xff0c;其噪声特性直接影响通信质量、时钟精度等关键指标。但教科书上复杂的传递函数公式总让人望而生畏——直到你发现用几行Pyth…...

Nunchaku FLUX.1-dev实战:手把手教你用ComfyUI生成惊艳AI图片

Nunchaku FLUX.1-dev实战&#xff1a;手把手教你用ComfyUI生成惊艳AI图片 1. 环境准备与快速部署 1.1 硬件与软件要求 在开始之前&#xff0c;请确保你的系统满足以下基本要求&#xff1a; 显卡&#xff1a;NVIDIA显卡&#xff08;推荐RTX 30/40系列&#xff0c;显存8GB&am…...

Qwen3-ForcedAligner-0.6B在字幕制作中的落地应用:SRT自动导出全流程

Qwen3-ForcedAligner-0.6B在字幕制作中的落地应用&#xff1a;SRT自动导出全流程 1. 引言&#xff1a;告别手动打轴&#xff0c;让字幕制作快10倍 如果你做过视频字幕&#xff0c;一定体会过手动打轴的痛苦。一集45分钟的视频&#xff0c;台词稿早就准备好了&#xff0c;但你…...

利用快马平台与vscode codex快速构建react待办事项应用原型

最近在尝试用AI工具快速验证产品原型&#xff0c;发现InsCode(快马)平台配合VSCode Codex能实现惊人的开发效率。以React待办事项应用为例&#xff0c;从零到可交互原型只用了不到10分钟&#xff0c;分享下具体实现思路和操作过程。 需求拆解与AI描述 首先将待办事项应用的7个核…...

如何用3dsconv解决3DS游戏格式兼容问题:从入门到精通的转换指南

如何用3dsconv解决3DS游戏格式兼容问题&#xff1a;从入门到精通的转换指南 【免费下载链接】3dsconv Python script to convert Nintendo 3DS CCI (".cci", ".3ds") files to the CIA format 项目地址: https://gitcode.com/gh_mirrors/3d/3dsconv …...