多线程概述

文章目录

  • 线程是什么
  • 线程有什么作用
  • 线程和进程的区别
  • 多线程相较于进程优势

在Java这个圈子中,多进程用的并不多,因为进程是一个重量级操作,进程是资源分配的基本单位,申请资源是一个比较消耗时间的操作.

线程是什么

  • 线程是一个独立的执行流,可以被独立调度到CPU上执行
    • 线程是操作系统调度执行的基本单位
    • 每个线程之间都可以按照顺讯执行自己的代码.
    • 多个线程之间并发执行着多份代码.

在这里插入图片描述

    举个例子,市面上有很多多线程下载器,如IDM,NDM等.这些多线程下载器在下载文件时,就可以把一个任务分为多个子任务,然后让每个线程完成一个子任务,每一个线程都是一个独立的执行流.这样做就可以增加下载速度.

    我们补充一点,线程是系统调度执行的最小单位,在线程执行过程中,操作系统中就不会再有进程这样的概念了,每个线程可以独立的进行调度。而线程也一样拥有PCB(Process Control Blob),只不过其中的进程标识符pid,内存指针,和文件描述符表是共用的,因为线程共享进程的资源。但是线程的PCB中状态、优先级、上下文、记账信息等影响调度执行的属性私有的(各不相同)。
在这里插入图片描述

线程有什么作用

    单核心CPU发展遇到瓶颈,通过增加CPU核心,提高算力,而并发编程就能够充分利用CPU的多个核心,从而将CPU的性能发挥到极致。在有些IO场景下,CPU就会有“闲置”,并发就能充分利用这部分空闲的CPU资源。总之,线程是用来实现高并发场景的,而高并发能提高程序执行的效率
    那么进程也能实现高并发场景,我们在Java中为什么不推荐使用多进程编程,而推荐使用多线程编程呢?那是因为虽然多进程也能实现 并发编程, 但是线程比进程更轻量进程是操作系统资源分配的最小单位,而多进程编程,会频繁的创建、销毁、调度进程,而这其中最大的时间消耗其实是申请资源,分配内存/硬盘是一个重量级的操作。
    主要是由于操作系统要管理大量的空闲的内存和硬盘资源。虽然操作系统中使用了一定的数据结构,把这些空间管理的还不错,但是即使如此,申请资源仍然还是一个低效操作。如果只申请一次资源,开销也就还不错,但如果频繁的申请和释放资源,开销就不可忽视了。

线程也叫作轻量级进程

  • 创建线程比创建进程更快
  • 销毁线程比销毁进程更快
  • 调度线程比调度进程更快

    虽然线程比进程更加轻量化,但是为了更加轻量(开销小,效率高)于是又引入了线程池(ThreadPool) 和 “协程”(Coroutine)这样的概念来进一步提高效率,我们后面会介绍到。

线程和进程的区别

  1. 本质区别在于,每个进程都拥有自己的一整套资源,而线程则是共享资源,开销小,更加轻量化
    • 内存指针和文件描述符表维护的进程创建时申请的内存和硬盘资源
  2. 进程包含线程,一个进程至少有一个线程即主线程。
  3. 进程是系统资源分配的最小单位,而线程则是系统调度的最小单位
  4. 进程之间具有独立性,一个进程崩溃,不会影响其他进程,而线程之间共享资源,一个线程崩溃可能会影响到其他的线程,严重的还可能会让线程所在的进程崩溃

多线程相较于进程优势

多线程在一些场景下是可以大大提高运行效率的。如果现在要下载一个100G大小的文件,我们可以怎么做呢?

方案一:将下载任务分成多个子任务,交给多个下载器下载.(多进程方式)
在这里插入图片描述
这种方式虽然可以提高下载速度,但是开启多个下载器,在操作系统中创建了多个进程,申请了更多的资源,开销比较大.

    方案二: 在一个下载器中开启多线程下载(多线程)
在这里插入图片描述
相较于多进程的方式,这种多线程的方式,复用了进程申请的资源,降低了申请资源上的开销,是一种更加轻量化的方案

    补充一点,刚开始创建进程时,主线程会随着进程一起被创建出来,这个时候也是有着一定的申请资源的开销的,但是这个开销并不会算在线程头上,而是记在了进程头上,而后面如果继续创建线程,则会复用进程的资源,开销也自然就小了。

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

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

相关文章

计算机毕业设计选题推荐-个人健康微信小程序/安卓APP-项目实战

✨作者主页:IT研究室✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

腾讯微服务平台TSF学习笔记(一)--如何使用TSF的Sidecar过滤器实现mesh应用的故障注入

Mesh应用的故障注入 故障注入前世今生Envoy设置故障注入-延迟类型设置故障注入-延迟类型并带有自定义状态码总结 故障注入前世今生 故障注入是一种系统测试方法,通过引入故障来找到系统的bug,验证系统的稳健性。istio支持延迟故障注入和异常故障注入。 …

黑马React18: 基础Part 1

黑马React: 基础1 Date: November 15, 2023 Sum: React介绍、JSX、事件绑定、组件、useState、B站评论 React介绍 概念: React由Meta公司研发,是一个用于 构建Web和原生交互界面的库 优势: 1-组件化的开发方式 2-优秀的性能 3-丰富的生态 4-跨平台开发 开发环境搭…

SpringBoot中日志的使用log4j

SpringBoot中日志的使用log4j 项目中日志系统是必不可少的,目前比较流行的日志框架有 log4j、logback 等,这两个框架的作者是同一个 人,Logback 旨在作为流行的 log4j 项目的后续版本,从而恢复 log4j 离开的位置。 另外 slf4j(…

vulhub redis-4-unacc

环境搭建 cd vulhub/redis/4-unacc docker-compose up -d 漏洞复现 检测 redis-cli -h ip 使用redis工具 工具地址:https://github.com/vulhub/redis-rogue-getshell 下载完成后,先进入RedisModulesSDK/exp/ 目录进行make操作 获得exp.so后可以进行…

【开发流程】持续集成、持续交付、持续部署

一、开发工作流程 假设把开发流程分为以下几个阶段: 编码 -> 构建 -> 集成 -> 测试 -> 交付 -> 部署 如上图所示,持续集成、持续交付、持续部署有着不同的软件自动交付周期。 二、持续集成、持续交付、持续部署 1、持续集成 持续集成…

服务器数据恢复—热备盘同步中断导致Raid5数据丢失的数据恢复案例

服务器数据恢复环境: 某单位一台服务器上有一组raid5阵列,该raid5阵列有15块成员盘。上层是一个xfs裸分区,起始位置是0扇区。 服务器故障&检测: 服务器raid5阵列中有硬盘性能表现不稳定,但是由于管理员长时间没有关…

nodejs+vue实验室上机管理系统的设计与实现-微信小程序-安卓-python-PHP-计算机毕业设计

用户:管理员、教师、学生 基础功能:管理课表、管理机房情况、预约机房预约;权限不同,预约类型不同,教师可选课堂预约和个人;课堂预约。 在实验室上机前,实验室管理员需要对教务处发来的上机课表…

浅析AcrelEMS-CIA机场智慧能源管平台解决方案-安科瑞 蒋静

1 概述 机场智慧能源管平台解决方案对机场范围内变电站内的高低压配电设备 、 发电机、变压器 、UPS、EPS 、广场照明 、 室内照明 、通风及排水等机电设备进行实时分布式监控和集中管理 , 实现无人值守 , 确保高速公路安全畅通 , 提高 自动化管理水平 , 降低机电设备的运行维…

SpringBoot常见注解

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏:每天一个知识点 ✨特色专栏&#xff1a…

程序员告诉你:人工智能是什么?

随着科技的快速发展,人工智能这个词汇已经逐渐融入了我们的日常生活。然而,对于大多数人来说,人工智能仍然是一个相对模糊的概念。 首先,让我们从人工智能的定义开始。人工智能是一种模拟人类智能的技术,它涵盖了多个领…

flink入门

1.安装flink,启动flink 文档地址:Apache Flink 1.3-SNAPSHOT 中文文档: Apache Flink 中文文档 代码:GitHub - apache/flink: Apache Flink 2. 打开端口 端口号, 启动jar ### 切换到flink 目录bin下 [rootlocalhost ~]# cd /…

参考文献格式

目录 期刊会议预印本(如arxiv) 期刊 找不到页码可以在文献中查看bibtex格式,其中有 外文期刊可在web of science中查找卷号、期号和所在页数: [1] ZHANG F, HU Z Q, FU Y K, et al. A New Identification Method for Surface …

【0到1学习Unity脚本编程】第一人称视角的角色控制器

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:【0…

自动驾驶学习笔记(九)——车辆控制

#Apollo开发者# 学习课程的传送门如下,当您也准备学习自动驾驶时,可以和我一同前往: 《自动驾驶新人之旅》免费课程—> 传送门 《Apollo Beta宣讲和线下沙龙》免费报名—>传送门 文章目录 前言 控制器设计 比例积分微分控制 线性…

Kotlin 知识体系

Kotlin 知识体系 1、Kotlin 文档2、Kotlin 基础3、桌面应用程序4、Android 与 iOS 应用程序 1、Kotlin 文档 Kotlin 是一门现代但已成熟的编程语言,旨在让开发人员更幸福快乐。 它简洁、安全、可与 Java 及其他语言互操作,并提供了多种方式在多个平台间复…

『亚马逊云科技产品测评』活动征文|借助AWS EC2搭建服务器群组运维系统Zabbix+spug

授权声明:本篇文章授权活动官方亚马逊云科技文章转发、改写权,包括不限于在 Developer Centre, 知乎,自媒体平台,第三方开发者媒体等亚马逊云科技官方渠道。 本文基于以下软硬件工具: aws ec2 frp-0.52.3 zabbix 6…

LRU最近最少使用算法

LRU(LeastRecentlyUsed)“最近最少使用”算法: 1.当缓存空间已满耗用时,淘汰最近最少使用数据的缓存对象以释放更多的缓存空间(用于历史缓存对象的维护)。 2. 哈希表:快速查找缓存对象;双向链表:维护 历史数据所在的节点顺序。 步骤&#xff…

掌握深度学习利器——TensorFlow 2.x实战应用与进阶

掌握深度学习利器——TensorFlow 2.x实战应用与进阶 摘要:随着人工智能技术的飞速发展,深度学习已成为当下最热门的领域之一。作为深度学习领域的重要工具,TensorFlow 2.x 备受关注。本文将通过介绍TensorFlow 2.x的基本概念和特性&#xff…

在 Linux 上搭建 Java Web 项目环境(最简单的进行搭建)

要在 Linux 上安装的程序有 1.JDK (要想运行 java 程序 JDK 是必不可少的) 2.Tomcat (HTTP 服务器,是管理 Web 项目的常用工具) 3. mysql (数据库) 一.安装 JDK 博主使用的 Linux 发行版是 centos ,cen…