多线程-02-多线程的典型应用(异步调用和提高效率)

一、怎么理解异步和同步

  1. 从方法的角度去理解:
    • 需要等待结果返回,才能继续运行就是同步
    • 不需要等待结果返回,就能继续运行就是异步
  • 注意:同步在多线程中还有另外一层意思:是让多个线程步调一致

同步调用

  1. 同步调用意味着在调用一个函数或方法时,调用者会等待该函数或方法执行完成并返回结果后,才会继续执行后续的代码。在多线程环境中,如果线程A调用了一个同步方法,那么线程A会在该方法执行完成之前被阻塞,无法继续执行其他任务。
  2. 同步调用的特点是:
    • 调用者会等待被调用者执行完成。
    • 保证了任务执行的顺序性和结果的确定性
    • 但可能会导致线程阻塞,降低系统的并发性能。

异步调用

  1. 异步调用则不同,当调用一个异步函数或方法时,调用者不会等待该函数或方法执行完成,而是立即返回并继续执行后续的代码。被调用的函数或方法会在后台线程中执行,当执行完成后,通常会通过回调函数、Future/Promise对象或其他机制来通知调用者。

  2. 异步调用的特点是:

    • 调用者不会等待被调用者执行完成。
    • 提高了系统的并发性能,因为调用者可以继续执行其他任务。
    • 但需要处理异步结果,增加了代码的复杂性。

多线程的应用——异步调用(案例1)

  • 单个线程的时候,所有代码都在同一个线程执行(下面的就是在main线程中执行),代码执行的时候都是同步的(即后面代码的执行需要前面代码执行完成才可以继续执行)
    在这里插入图片描述

  • 多线程可以让方法执行变为异步的(即不用等待前面代码的执行)比如说这里的读取磁盘文件时,假设读取操作花费了 5 秒钟,如果没有线程调度机制,这 5 秒 cpu 什么都做不了,其它代码都得暂停…(如上图)

  • 使用多线程之后,读取文件的操作放在一个新的线程中执行,那么后面的代码就不需要等待读取文件操作完成之后再执行了,因为后面的代码与文件读取操作的代码不在同一个线程中,这就可以理解为多线程的异步调用
    在这里插入图片描述

三、多线程异步调用的场景

  1. 比如在项目中,视频文件需要转换格式等操作比较费时,这时开一个新线程来处理视频转换,这样就可以避免阻塞主线程
  2. tomcat 的异步 servlet 也是类似的目的,它让用户线程处理耗时较长的操作,这样可以避免阻塞 tomcat 的工作线程
  3. 在ui 程序中,可以开新线程进行其他操作,这样可以避免阻塞 ui 线程
  4. 。。。。。。。

四、多线程异步调用和多线程同步调用的概念理解

  1. 多线程的异步调用和同步调用是并发编程中的核心概念,它们决定了线程之间如何协作以及任务如何被执行

一、多线程的同步调用

  1. 定义:多线程的同步调用指的是多个线程在访问共享资源时,需要按照某种顺序来确保资源在某一时刻只能被一个线程使用,以避免数据竞争和不一致的问题。
  2. 特点:
    • 线程之间需要相互等待和协调,以确保资源的正确访问。
    • 同步机制(如锁、信号量等)被用来控制对共享资源的访问。
    • 提高了数据的一致性和安全性,但可能导致线程阻塞和性能下降。
  3. 实现方式:
    • 使用synchronized关键字:在Java中,可以通过在方法或代码块上使用synchronized关键字来实现同步。
    • 使用锁(Lock):除了synchronized,还可以使用Java提供的ReentrantLock等锁机制来实现更灵活的同步控制。
    • 使用信号量(Semaphore):信号量是一种更高级的同步机制,可以控制同时访问共享资源的线程数量。
  4. 适用场景:
    • 当多个线程需要访问和操作共享数据时,使用同步调用可以确保数据的一致性和安全性。
    • 在需要保护临界区或实现互斥访问的场景中,同步调用也是必要的。

二、多线程的异步调用

  1. 定义:多线程的异步调用指的是线程之间不需要相互等待,一个线程可以在不阻塞其他线程的情况下继续执行其他任务。异步调用通常通过回调函数、Future/Promise对象或其他机制来通知调用者任务的结果。
  2. 特点:
    • 线程之间不需要相互等待,提高了系统的并发性和响应速度。
    • 异步调用不会阻塞调用线程,使得调用线程可以继续执行其他任务。
    • 增加了代码的复杂性和调试难度,因为需要处理异步结果和可能的错误。
  3. 实现方式:
    • 使用线程池:线程池可以管理一组线程,并允许开发者以异步方式提交任务给这些线程执行。
    • 使用回调函数:当异步任务完成时,可以通过回调函数来处理任务的结果。
    • 使用Future/Promise对象:这些对象提供了获取异步任务结果的方法,并允许在任务完成时设置结果或异常。
  4. 适用场景:
    • 当任务需要执行耗时的I/O操作时(如网络请求、文件读写等),使用异步调用可以提高系统的响应速度和并发性能。
    • 在需要执行多个独立任务并希望并行处理它们的场景中,异步调用也是有效的选择。

三、比较与选择

  1. 性能:
    • 同步调用在保护共享资源和确保数据一致性方面表现更好,但可能导致线程阻塞和性能下降。
    • 异步调用提高了系统的并发性和响应速度,但增加了代码的复杂性和调试难度。
  2. 适用场景:
    • 同步调用适用于需要保护共享资源和确保数据一致性的场景。
    • 异步调用适用于需要执行耗时I/O操作或并行处理多个独立任务的场景。
  3. 选择建议:
    • 在选择同步或异步调用时,需要根据具体的应用场景和需求进行权衡。
    • 如果数据一致性和安全性是首要考虑因素,那么同步调用可能是更好的选择。
    • 如果系统的并发性能和响应速度是首要考虑因素,并且可以接受一定的代码复杂性和调试难度,那么异步调用可能是更合适的选择。

多线程的应用——提高效率(案例2)

  1. 单核 cpu 下,多线程不能实际提高程序运行效率,只是为了能够在不同的任务之间切换,不同线程轮流使用cpu ,不至于一个线程总占用 cpu,别的线程没法干活
  2. 多核 cpu 可以并行跑多个线程,但能否提高程序运行效率还是要分情况的,有些任务,经过精心设计,将任务拆分,并行执行,当然可以提高程序的运行效率。但不是所有计算任务都能拆分的,也不是所有任务都需要拆分,任务的目的如果不同,谈拆分和效率没啥意义
  3. IO 操作不占用 cpu,只是我们一般拷贝文件使用的是【阻塞 IO】,这时相当于线程虽然不用 cpu,但需要一直等待 IO 结束,没能充分利用线程。所以才有后面的【非阻塞 IO】和【异步 IO】优化。

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

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

相关文章

【数据分享】中国汽车工业年鉴(1986-2023)

本年鉴是由工业和信息化部指导,中国汽车技术研究中心有限公司与中国汽车工业协会联合主办。《年鉴》是全面、客观记载中国汽车工业发展与改革历程的重要文献,内容涵盖汽车产业政策、标准、企业、市场以及全国各省市汽车工业发展情况,并调查汇…

Matlab实现北方苍鹰优化算法优化随机森林算法模型 (NGO-RF)(附源码)

目录 1.内容介绍 2.部分代码 3.实验结果 4.内容获取 1内容介绍 北方苍鹰优化算法(Northern Goshawk Optimization, NGO)是一种新颖的群智能优化算法,灵感源自北方苍鹰捕食时的策略。该算法通过模拟苍鹰的搜寻、接近和捕捉猎物的行为模式&am…

CentOS使用中遇到的问题及解决方法

一、CentOS 7网络配置(安装后无法联网问题) 现象说明 在安装CentOS系统后,有可能出现无法联网的问题,虚拟机中的网络配置并没有问题,而系统却无法联网,也ping不通。 原因描述 CentOS默认开机不启动网络,因…

QT基础 UI编辑器 QT5.12.3环境 C++环境

一、UI编辑器 注意:创建工程时,要勾上界面按钮 UI设计师界面的模块 UI编辑器会在项目构建目录中自动生成一个ui_xxx.h(构建一次才能生成代码),来表示ui编辑器界面的代码,属于自动生成的,一定不…

数据分析-Excel基础操作

目录 周报讲解 基础概念 理解数据 筛选excel表 数据透视表 插入数据透视表 新建字段 切片器(筛选) 数据透视图 Excel常用函数 sum(求和) 1-8月GMV 1月和8月GMV sumif(条件求和) sumifs 日G…

OpenCV双目立体视觉重建

本篇文章主要给出使用opencv sgbm重建三维点云的代码,鉴于自身水平所限,如有错误,欢迎批评指正。 环境:vs2015 ,opencv3.4.6,pcl1.8.0 原始数据使用D455采集,图像已做完立体校正,如下…

Clip结合Faiss+Flask简易版文搜图服务

一、实现 使用目录结构&#xff1a; templates ---upload.html faiss_app.py 前端代码&#xff1a;upload.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content&quo…

Linux驱动开发快速入门——字符设备驱动(直接操作寄存器设备树版)

Linux驱动开发快速入门——字符设备驱动 前言 笔者使用开发板型号&#xff1a;正点原子的IMX6ULL-alpha开发板。ubuntu版本为&#xff1a;20.04。写此文也是以备忘为目的。 字符设备驱动 本小结将以直接操作寄存器的方式控制一个LED灯&#xff0c;可以通过read系统调用可以…

概念解读|K8s/容器云/裸金属/云原生...这些都有什么区别?

随着容器技术的日渐成熟&#xff0c;不少企业用户都对应用系统开展了容器化改造。而在容器基础架构层面&#xff0c;很多运维人员都更熟悉虚拟化环境&#xff0c;对“容器圈”的各种概念容易混淆&#xff1a;容器就是 Kubernetes 吗&#xff1f;容器云又是什么&#xff1f;容器…

《机器人控制器设计与编程》考试试卷**********大学2024~2025学年第(1)学期

消除误解&#xff0c;课程资料逐步公开。 复习资料&#xff1a; Arduino-ESP32机器人控制器设计练习题汇总_arduino编程语言 题-CSDN博客 试卷样卷&#xff1a; 开卷考试&#xff0c;时间&#xff1a; 2024年11月16日 001 002 003 004 005 ……………………装………………………

本地音乐服务器(三)

6. 删除音乐模块设计 6.1 删除单个音乐 1. 请求响应设计 2. 开始实现 首先在musicmapper新增操作 Music findMusicById(int id);int deleteMusicById(int musicId); 其次新增相对应的.xml代码&#xff1a; <select id"findMusicById" resultType"com.exa…

如何在项目中用elementui实现分页器功能

1.在结构部分复制官网代码&#xff1a; <template> 标签: 这是 Vue 模板的根标签&#xff0c;包含所有的 HTML 元素和 Vue 组件。 <div> 标签: 这是一个普通的 HTML 元素&#xff0c;包裹了 el-pagination 组件。它没有特别的意义&#xff0c;只是为了确保 el-pagi…

VB.Net笔记-更新ing

1.1 设置默认VS的开发环境为VB.NET&#xff08;2024/11/18&#xff09; 1.2 新建一个“Hello&#xff0c;world”的窗体&#xff08;2024/11/18&#xff09; 1.3 计算圆面积的小程序&#xff08;2024/11/18&#xff09; 显示/隐式 声明 &#xff08;2024/11/18&#xff0…

每日一练:【优先算法】双指针之移动零(easy)

双指针概念介绍 常见的双指针有两种形式&#xff0c;一种是对撞指针&#xff0c;一种是左右指针。 对撞指针&#xff1a;一般用于顺序结构中&#xff0c;也称左右指针。 • 对撞指针从两端向中间移动。一个指针从最左端开始&#xff0c;另一个从最右端开始&#xff0c;然后逐渐…

树状数组 Color the ball hdu 1556 线段树 洛谷p3372

目录 前言 树状数组 lowbit函数 直观表述 代码 运行结果 树状数组构建代码 树状数组的应用 单点修改和&#xff08;单点&#xff09;区间查询 结合差分数组区间修改 ,单点查询 差分数组 Color the ball hdu 1556 问题描述 问题分析 代码 线段树 洛谷p3372 问题描述 问题…

学习笔记022——Ubuntu 安装 MySQL8.0版本踩坑记录

目录 1、查看可安装 MySQL 版本 2、Ubuntu安装 MySQL8.0 3、MySQL8.0 区分大小写问题 4、MySQL8.0 设置sql_mode 5、MySQL8.0 改端口33060&#xff08;个人遇到问题&#xff09; 1、查看可安装 MySQL 版本 ## 列出可用的MySQL版本&#xff08;列出所有可用的MySQL版本以…

【数据结构】树——链式存储二叉树的基础

写在前面 书接上文&#xff1a;【数据结构】树——顺序存储二叉树 本篇笔记主要讲解链式存储二叉树的主要思想、如何访问每个结点、结点之间的关联、如何递归查找每个结点&#xff0c;为后续更高级的树形结构打下基础。不了解树的小伙伴可以查看上文 文章目录 写在前面 一、链…

qt之QFTP对文件夹(含嵌套文件夹和文件)、文件删除下载功能

一、前言 主要功能如下&#xff1a; 1.实现文件夹的下载和删除&#xff0c;网上很多资料都是单独对某个路径的文件操作的&#xff0c;并不能对文件夹操作 2.实现目标机中含中文名称自动转码&#xff0c;有些系统编码方式不同&#xff0c;下载出来的文件会乱码 3.实现ftp功能…

集群聊天服务器(7)数据模块

目录 Mysql数据库代码封装头文件与源文件 Mysql数据库代码封装 业务层代码不要直接写数据库&#xff0c;因为业务层和数据层的代码逻辑也想完全区分开。万一不想存储mysql&#xff0c;想存redis的话&#xff0c;就要改动大量业务代码。解耦合就是改起来很方便。 首先需要安装m…

手机远程控制电脑,让办公更快捷

在数字化办公的浪潮下&#xff0c;远程控制软件已成为连接工作与生活的桥梁。它使得用户能够通过一台设备&#xff08;主控端&#xff09;来操作另一台设备&#xff08;被控端&#xff09;&#xff0c;无论它们是否位于同一局域网内。这种软件广泛应用于远程办公、手机远程控制…