【JavaEE】认识线程

news2024/12/24 0:24:02

目录

1、什么是线程

 2、为什么引入线程

2.1、线程的优缺点

3、CPU的工作原理 

 4、线程和进程的关系

 4.1、线程和进程的入口函数

4.2、线程独享的资源


1、什么是线程

一个进程中可以有一个或者多个线程,每个线程都是一个独立的执行流。多个线程之间,也是并发(并行+并发)执行的。

这里的多线程可能是在多个CPU核心上,同时运行,也可能是在一个CPU核心上,通过快速调度进行运行。在第一个JavaEE的博客中说到进程的调度,指的是这些进程里面只有一个线程。操作系统中真正调度的是线程,而不是进程。

  1. 线程是操作系统调度运行基本单位
  2. 进程是操作系统资源分配基本单位
  3. 线程之间共享进程资源。

 2、为什么引入线程

早在80年代,由于进程的创建和销毁以及切换存在较大空间的开销,因此人们急需一种轻型的进程技术来减少资源的开销,于是线程在这种背景之下产生了。

2.1、线程的优缺点

优点: 

  • 创建线程比创建进程更快
  • 销毁线程比销毁进程更快
  • 调度线程比调度进程更快
  • 创建一个进程,进程中的线程可以共享进程的资源,资源的开销减少。

缺点:

虽然说线程之间的调度开销小,但是由于多个线程共享同一个进程中的资源,如果一个线程崩溃了,那么有可能导致整个进程被抹杀。但是进程之间的调度不存在这个问题,每个进程都是独立的空间,都有独立的资源,一个进程崩溃不会影响到其他进程的运行。

3、CPU的工作原理 

要了解线程和进程之前我们还要了解一下一段代码在CPU中执行过程。

  • CPU只知道两件事,1、从内存中读取指令,2、执行指令,执行完成之后,回到1.
  • 注意这里计算器为了提高效率,CPU中存在寄存器,读取数据的时候他会从PC寄存器(Program Counter Register)中读取数据存放在内存中的地址。PC寄存器也就是程序计数器。程序计数器有寄存信息和计数两种功能结构。
  • 我们写的代码通过编译器生成可执行文件(01代码),存放在磁盘中,内存中的指令是通过加载磁盘中的可执行文件形成的。 

 

 计算机在执行这些指令的时候,只需要找到函数被编译之后的第一条指令就可以了,这就是入口函数。

 4、线程和进程的关系

 4.1、线程和进程的入口函数

进程的入口函数就是main方法, 线程诞生之前进程中就只有一个执行流。线程诞生之后进程之中会存在多个线程。这个时候每个线程就需要自己的入口函数。

 把CPU的PC寄存器指向线程的入口函数,这样线程就可以运行起来了,这就是为什么我们创建线程时必须指定一个入口函数的原因.

4.2、线程独享的资源

函数在别执行的时候产生的数据包括函数参数、局部变量、返回地址等信息,这些信息是保存在栈中的。操作系统要为每个线程在进程的地址空间中分配一个栈,即每个线程都有独属于自己的栈。

线程运行的本质其实就是函数的执行,函数的执行总有一个源头,这个源头就是所谓的入口函数。cpu从入口函数开始执行从而形成一个执行流。这个执行流就是线程。 

  •  CPU执行指令的信息保存在程序计数器中,通过这个寄存器计算机就可以知道接下来执行那一条指令。由于多线程可以是并发进行的,所以一个线程在执行一段之后,可能会被停止,因此程序计数器需要保存下这个线程被执行都那个地方的信息,以便于下次要继续执行这个线程的时候,知道从哪里开始。
  • 同时函数运行时需要额外的寄存器来保存一些信息,像部分局部变量之类。这些寄存器也是线程私有的,一个线程不可能访问到另一个线程的这类寄存器信息。
  • 💥💥从上面的讨论中我们知道,到目前为止,所属线程的栈区、程序计数器、栈指针以及函数运行使用的寄存器是线程私有的。
  • 以上这些信息有一个统一的名字,就是线程上下文(throead context)

 除此之外,剩下的都是线程间共享资源。

❗❗❗总结线程的私有资源 

具体来说,线程的私有资源有以下这些

  1. 线程ID:每个线程都有字节唯一的ID,用于区分不同的线程
  2. 寄存器组的值:当线程切换时,必须将原有的线程的寄存器集合的状态保存,以便重新切换时得以恢复。
  3. 线程的堆栈:堆栈是保证线程独立运行所必须的
  4. 错误返回码:由于同一进程中有很多线程同时运行,可能某个线程进行系统调用后设置了error值,而在该线程还没有处理这个错误,另一个线程就在此时被调度器投入运行,这样错误值就有可能别修改。所以,不同的线程应该拥有自己的错误返回码变量。
  5. 线程优先级:线程调度的次序(并不是优先级大的一定先执行,优先级大只是最先执行的机会大。线程的优先级就像个CPU提一个建议的左右,采不采用有CPU决定)

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

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

相关文章

嵌入式开发--无刷电机学习3--帕克变换

帕克变换的物理意义 前面说到克拉克变换的物理意义,是将三相定子线圈产生磁场的过程,等效为2个正交放置的线圈,来产生同样的磁场。通过控制这两个正交线圈即可等效控制三相定子线圈。 还有一个问题,定子线圈产生的磁场&#xff…

集群与存储

所谓集群就是通过高速网络将很多服务器集中起来一起提供一种服务,在客户端看起来就是只有一个服务器 任务调度是集群中的核心系统 HPC高性能计算集群 LB负载均衡 HA高可用 LVS工作模式 NAT 网络地址转换 -m DR 路由模式 节点需要VIP -g TUN 隧道模式 -i 调度…

「Codeforces」D. Big Brush

D. Big Brush https://codeforces.com/contest/1638/problem/D 题目描述 给你一张 n m n\times m nm 大的网格纸,你有一把 2 2 2 \times 2 22 的刷子,每次只能涂满这么多,即 ( i , j ) 、 ( i 1 , j ) 、 ( i , j 1 ) 、 ( i 1 , j …

第二十二章 光照贴图

光照贴图过程将预先计算场景中静态物体表面的亮度,并将结果存储在称为“光照贴图”的纹理中供以后使用。光照贴图可以包含直接光照和间接光照,以及阴影效果。但是,烘焙到光照贴图中的数据无法在运行时更改,这就是为什么移动静态物…

Python入门教程+项目实战-12.1节: 字典的基础概念

目录 12.1.1 理解字典类型 12.1.2 字典的类型名 12.1.3 字典的定义 12.1.4 在循环中遍历字典 12.1.5 字典的键类型 12.1.6 知识要点 12.1.7 系统学习python 12.1.1 理解字典类型 在日常生活中,我们常常会接触到“字典”这种数据类型,例如一本书籍…

排序篇:直接插入、希尔、直接选择和堆排序(C语言)

目录 前言: 一:插入排序 (1)直接插入排序 基础思路(有个印象就行,主要看单趟): 单趟排序: 完整排序: 时间复杂度分析: (2)希尔排序 基础思路(有个印象就行,主要看单趟)&#…

【2023 年第十三届 MathorCup 高校数学建模挑战赛】D 题 航空安全风险分析和飞行技术评估问题 27页论文及代码

【2023 年第十三届 MathorCup 高校数学建模挑战赛】D 题 航空安全风险分析和飞行技术评估问题 27页论文及代码 1 题目 D 题 航空安全风险分析和飞行技术评估问题 飞行安全是民航运输业赖以生存和发展的基础。随着我国民航业的快速发展,针对飞行安全问题的研究显得…

网络编程 总结一

一、网络基础: 概念:1> 网络编程的本质就是进程间的通信,只不过进程分布在不同的主机上 2>在跨主机传输过程中,需要确定通信协议后,才可以通信 1. OSI体系结构(重点) 定义7层模型&…

针对近日ChatGPT账号大批量封禁的理性分析

文 / 高扬 这两天不太平。 3月31号,不少技术圈的朋友和我闲聊说,ChatGPT账号不能注册了。 我不以为然,自己有一个号足够了,并不关注账号注册的事情。 后面又有不少朋友和我说ChatGPT账号全部不能注册了,因为老美要封锁…

Java笔记_15(不可变集合、Stream流、方法引用)

Java笔记_15 一、创建不可变集合1.1、创建不可变集合的应用场景1.2、创建不可变集合的书写格式 二、Stream流2.1、体验Stream流2.2、Stream流的思想和获取Stream流2.3、Stream流的中间方法2.4、Stream流的终结方法2.5、收集方法collect2.6、练习-数字过滤2.7、练习-字符串过滤并…

Python词云图的制作与案例分享(包含 wordcloud 和 jieba库)

一、基本知识 Python 有很多可用于制作词云图的库,其中比较常用的有 wordcloud 和 jieba。 wordcloud 是一个用于生成词云图的 Python 库,其使用了 Python 的 PIL 库和 numpy 库。您可以使用 pip 命令来安装 wordcloud 库: pip install wo…

第12章 项目沟通管理和干系人管理

文章目录 12.1.2 沟通的方式 404沟通管理计划的编制过程12.2.2 制订沟通管理计划的工具 4114、沟通方法 12.3.2 管理沟通的工具 41312.4.2 控制沟通的技术和方法 4163、会议 12.5.1 项目干系人管理所涉及的过程 420项目干系人管理的具体内容:(1&#xff…

从“青铜”到“王者”,制造企业的数字化闯关记

打过游戏的朋友可能有一个常识,越是精彩纷呈、奖励丰厚的副本,越是需要召集队友一同组团闯关。很多实体企业在数字化转型中,也不会单打独斗,一把手会先找咨询公司对企业内外情况进行调研、梳理、规划,提出一个顶层规划…

科学计算库—numpy随笔【五一创作】

文章目录 8.1、numpy8.1.1、为什么用 numpy?8.1.2、numpy 数据类型推理8.1.3、numpy 指定长度数组快速创建8.1.4、numpy 哪个是行、列?8.1.5、numpy 如何进行数据类型转换?8.1.6、numpy 有几种乘法?8.1.7、numpy 索引和切片操作8.…

2023年前端面试题汇总-代码输出篇

1. 异步 & 事件循环 1. 代码输出结果 const promise new Promise((resolve, reject) > {console.log(1);console.log(2); }); promise.then(() > {console.log(3); }); console.log(4); 输出结果如下: 1 2 4 promise.then 是微任务,它…

【今日重磅—国产大模型首批内测机会来了】什么是讯飞星火,如何获得内测和使用方法

♥️作者:白日参商 🤵‍♂️个人主页:白日参商主页 ♥️坚持分析平时学习到的项目以及学习到的软件开发知识,和大家一起努力呀!!! 🎈🎈加油! 加油&#xff01…

数电实验:Quartus II 软件使用 (八进制计数器和全加器)

一、实验目的: 1.熟悉可编程逻辑器件的设计工具Quartus II 软件的使用。 2.熟悉FPGA开发实验系统的软件环境,掌握各个菜单和图标的作用和功能。 二、实验内容 (1)以74160实现八进制计数器为例,学Quartus II 软件的…

【手撕代码系列】JS手写实现Promise.all

Promise.all() 方法接收一个 Promise 对象数组作为参数,返回一个新的 Promise 对象。该 Promise 对象在所有的 Promise 对象都成功时才会成功,其中一个 Promise 对象失败时,则该 Promise 对象立即失败。 本篇博客将手写实现 Promise.all() 方…

Peforce(Helix) 使用快速介绍

虽然Git应该是当下使用最多的版本控管工具, 但曾经作为版本控管巨头的Perforce还是在持续的发展和更新中, 在某些企业中,还是作为软件的版本控管工具之一。 Helix 截止2023, Perforce 的最新版本的名称是Helix ,这个词翻译的意思是螺旋&…

【手撕代码系列】JS手写实现Promise.race

公众号:Code程序人生,分享前端所见所闻。 Promise.race() 是一个常见的 JavaScript Promise 方法,它接受一个 Promise 数组作为参数,并返回一个新的 Promise 对象。这个新的 Promise 对象在传入的 Promise 数组中,任意…