多线程概述

文章目录

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

在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支持延迟故障注入和异常故障注入。 …

C++二分查找算法:找到 Alice 和 Bob 可以相遇的建筑

本文涉及的基础知识点 二分查找算法合集 离线查询 题目 给你一个下标从 0 开始的正整数数组 heights &#xff0c;其中 heights[i] 表示第 i 栋建筑的高度。 如果一个人在建筑 i &#xff0c;且存在 i < j 的建筑 j 满足 heights[i] < heights[j] &#xff0c;那么这个…

黑马React18: 基础Part 1

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

linux mount命令加速

一般远程mount 的用法如下&#xff1a; #mount 远程ip:远程目录 本地目录 //如果本地目录不存在需要创建 mount 192.168.110.111:/home/caixxx /home/cym 但是该命令默认使用的协议是nfs4&#xff0c;这个协议如果读写块大小参数设置的不合适&#xff0c;mount后读取远程目…

SpringBoot中日志的使用log4j

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

vulhub redis-4-unacc

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

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

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

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

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

C++中的this指针

C中的this指针 this 实际上是成员函数的一个形参&#xff0c;在调用成员函数时将对象的地址作为实参传递给 this。不过 this 这个形参是隐式的&#xff0c;它并不出现在代码中&#xff0c;而是在编译阶段由编译器默默地将它添加到参数列表中。 this指针是类的指针&#xff0c…

SpringBoot 集成 RocketMQ

一、RocketMQ基本概念 消息模型&#xff08;Message Model&#xff09; RocketMQ主要由Producer、Broker、Consumer三部分组成&#xff0c;其中Producer负责生产消息&#xff0c;Consumer负责消费消息&#xff0c;Broker负责存储消息。Broker在实际部署过程中对应一台服务器&…

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

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

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

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

k8s运维管理

node管理 node隔离与恢复 1.使用patch命令 #实现node隔离调度 kubectl patch node node1 -p {"spec":{"unschedulable":true}} #节点信息多了一项SchedulingDisabled node1 Ready,SchedulingDisabled <none> 7d3h v1.18.20 #解除 kubectl …

C语言二叉树的建立和遍历

tree.h typedef struct TreeNode_s {char val;//数据域struct TreeNode_s *pLeft;//左结点struct TreeNode_s *pRight;//右边结点 } TreeNode_t, *pTreeNode_t;//辅助队列建立二叉树 typedef struct QueueNode_s {pTreeNode_t NodeAddr; //数据域存储一个二叉树结点的地址 str…

SpringBoot常见注解

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

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

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

C++中将 sizeof() 用于类

C中将 sizeof() 用于类 您知道&#xff0c;通过使用关键字 class 声明自定义类型&#xff0c;可封装数据属性和使用数据的方法。运算符 sizeof( )用于确定指定类型需要多少内存&#xff0c;单位为字节。这个运算符也可用于类&#xff0c;在这种情况下&#xff0c;它将指出类声…

flink入门

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

参考文献格式

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