JAVA----线程

news2024/11/26 6:22:06

线程
上回说到
进程 = > 运行起来的程序 = > 并发编程 = > 多核 CPU

操作系统管理进程:

  1. 先描述 = > PCB 结构体 来把进程的各种属性都表示出来
  2. 再组织 = > 通过链表数据结构把多个 PCB 串起来.

PCB 核心属性(进程调度)

  1. pid 进程标识符
  2. 内存指针, 该进程依赖的 指令 和 数据 在哪里
  3. 文件描述符表, 该进程打开了哪些文件
  4. 状态, 优先级, 上下文, 记账信息

“一核不够, 多核来凑”, 当前的 CPU 都是 多核心 CPU
但是需要通过一些特定的编程技巧(并发编程----并行 + 并发), 把要完成的任务, 拆解成多个部分, 并且分别让他们在不同的 CPU 上运行.否则, 多核心 CPU 就形同虚设了----“一核有难, 多核围观”.

通过 “多进程” 编程的模式, 其实就可以起到 “并发编程” 的效果.因为 进程 可以被调度到不同的 CPU 上运行, 此时则可以解决问题.

虽然, 多进程编程 可以解决上述问题, 但也带来了新的麻烦.
一个服务器,要能够同时给多个客户端提供服务,如果同时间, 来了很多客户端, 服务器如果只能利用一个 CPU 核心工作, 速度就会很慢.

一种典型的做法:
每个客户端连上连上服务器, 服务器都创建一个进程, 给客户端提供服务, 这个客户端断开了, 服务器再把进程给释放掉. 若这个服务器频繁的有客户,则服务器也需要频繁创建/销毁进程. 过于频繁则会使服务器响应速度变慢.

线程(thread)

注意读音
线程, 本身是操作系统提供的, 操作系统提供了 API 让我们操作线程.
JVM 就对操作系统 API 进行了封装.
线程这里, 提供了 Thread 类, 表示线程

我们引入线程, 主要的初心, 就是为了解决 上述 “进程” 太重量问题(创建/销毁 开销过大).

线程, 可以理解为 “进程的一部分”, 一个进程中, 可以包含一个线程, 或者多个线程, 若干个 PCB 联合在一起, 是描述一个进程的.

PCB

  1. pid; (每个线程都不一样);
  2. 内存指针;
  3. 文件描述符表;
    (同一个进程的若干个线程, 这里的 内存指针 和 文件描述符表, 其实是同一个);
  4. 状态, 上下文, 优先级, 记账信息;(每一个线程有一组自己的属性);
  5. tgid (同一个进程的 tgid 是同一个).

同一个进程中的若干线程之间, 是共同系统的内存资源和文件资源的.
(线程1 中 new 个对象, 线程2 是可以访问到的; 线程1 打开一个文件, 线程2 也是可以之间使用的),但是每个线程都是独立在CPU上调度执行的.

进程是系统资源分配的基本单位
线程是系统调度执行的基本单位

为什么说, 线程比进程更轻量? 为什么说线程的传教/销毁的开销, 比进程更小?

核心在于, 创建进程, 可能要包含多个线程, 这个过程中, 涉及到 资源分配/资源释放.
而创建线程(创建进程----含有一个线程的也是进程), 同一个进程包含 N个线程, 这些线程之间是公用资源, 相当于 资源 已经有了, 省去了 资源分配/资源释放 的步骤了. (申请资源和释放资源是个很重量的事情).

举个栗子

  1. 如 桌有一蛋糕, 一个人吃, 是一个线程, 两人吃, 是引入了新线程.
    在这里插入图片描述

  2. 随着引入的线程越多, 每个线程要完成的任务量就更小了, 蛋糕吃完的速度就会更快.
    在这里插入图片描述

  3. 继续引入
    在这里插入图片描述
    引入线程过多, 发现桌子的大小是有限的, 导致有些人无法吃到蛋糕, 无法和桌旁的人 “并发” 吃蛋糕. 并且外围的人往里挤, 则可能把里面正在吃蛋糕的人打断. 此时, 线程的开销就会很明显, 程序的性能可能不升反降.

  4. 多个线程共同完成某个任务
    在这里插入图片描述
    即使不满的情况下, 多个人之间, 也是可能发生冲突的.
    1号人, 看上了一个草莓
    2号人, 也看上了同一个草莓
    则会导致冲突, 程序就会出现 BUG
    这就是 [线程安全问题]

  5. 若某个人出现了问题, 直接掀桌, 则使别的人也吃不成

一个程序抛出异常, 并且没有很好的捕获成功, 则会使整个进程退出, 其他线程也就崩了.
相比之下, 进程与进程之间, 独立性就比线程的独立性更好, 一个进程挂了, 一般不会影响其他进程.


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

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

相关文章

NIKKI DENSO伺服驱动器维修NCR-CAB1A2D-801B

NEXSRT伺服驱动器维修NPSA-MU日机电装伺服维修ACTUS POWER,NCS-ZE12MDA/ZE1MDA-601A,NEXSRT日机电装伺服维修NCS-ZE12MDB-401A/NCS-ZAMDA-401AG。 NIKKI常见故障原因及处理方法: 1、电机在一个方向上比另一个方向跑得快; (1) 故…

Keil MDK 5.37 及之后版本 安装 AC5(ARMCC) 编译器详细步骤

由于 Keil 5.37 及之后版本不再默认安装 AC5(ARMCC) 编译器,这就会导致由 AC5 编译的工程无法正常编译,往往输出窗口会提示以下信息:*** Target ‘STM32xxxx‘ uses ARM-Compiler ‘Default Compiler Version 5‘ which is not available. —…

Redis数据库:概念、安装及常用操作命令

目录 前言 一、数据库概述 1、关系型数据库(RDBMS) 1.1 产生背景 1.2 概念 1.3 特点 1.4 优缺点 1.5 常见主流关系型数据库 2、非关系型数据库(NoSQL) 2.1 产生背景 2.2 概念 2.3 特点 2.4 优缺点 2.5 常见主流非关…

实验三 Java类的继承与派生(计算机专业)

实验三 Java类的继承与派生(头歌) 制作不容易,点个关注!给大家带来更多的价值! 目录 实验三 Java类的继承与派生(头歌)** 制作不容易,点个关注!给大家带来更多的价值&…

HBase(超级无敌详细PROMAX讲解版)

简介 概述 图-1 HBase图标 HBase原本是由Yahoo!公司开发的后来贡献给了Apache的一套开源的、基于Hadoop的、分布式的、可扩展的非关系型数据库(Non-Relational Database),因此HBase不支持SQL(非关系型数据库基本上都不支持SQL),而是提供了一套单独的命…

文件搜索案列 --java

目标: 搜索盘符下面符合要求的文件名,并可以选择是否打开该文件 代码: import java.io.File; import java.io.IOException; import java.util.Arrays; import java.util.Scanner;public class findQQ {public static void main(String[] a…

Node.js-------初识Node.js与内置模块

能够知道什么是 Node.js能够知道 Node.js 可以做什么能够说出 Node.js 中的 JavaScript 的组成部分能够使用 fs 模块读写操作文件能够使用 path 模块处理路径能够使用 http 模块写一个基本的 web 服务器 一.初识Node.js 1.浏览器中的 JavaScript 的组成部分 2.Node.js 简介 …

vscode安装通义灵码

作为vscode的插件,直接使用 通义灵码-灵动指间,快码加编,你的智能编码助手 通义灵码,是一款基于通义大模型的智能编码辅助工具,提供行级/函数级实时续写、自然语言生成代码、单元测试生成、代码注释生成、代码解释、研…

【日常记录】【JS】createNodeIterator 遍历DOM节点

文章目录 1、介绍2、createNodeIterator3、nodeType4、参考链接 1、介绍 createNodeIterator() 方法是 DOM API 中的一个方法,用于创建一个 NodeIterator 对象,可以用于遍历文档树中的一组 DOM 节点。就是可以把DOM 变成可遍历的 2、createNodeIterator …

SVM简介 详细推导 核函数 线性可分 非线性可分

SVM(Support Vector Machine) Vapnik发明用于解决二分类问题的机器学习算法。 线性可分与非线性可分 在二维平面中,线性可分指的是可以通过一条直线对平面上的点进行划分使得标签相同的点在直线的同一侧,标签不同的点在直线的不同侧。 在二维平面中&…

Linux:基本指令篇

文章目录 前言1.ls 指令2.pwd命令3.cd 指令4.touch指令5.mkdir指令(重要)6.rmdir指令 && rm 指令(重要)7.man指令(重要)8.cp指令(重要)9.mv指令(重要&#xff09…

时序数据库IoTDB:功能详解与行业应用

一文读懂时序数据库 IoTDB。 01 为什么需要时序数据库 解释时序数据库前,先了解一下何谓时序数据。 时序数据,也称为时间序列数据,是指按时间顺序记录的同一统计指标的数据集合。这类数据的来源主要是能源、工程、交通等工业物联网强关联行业…

【Java面试题系列】基础篇

目录 基本常识标识符的命名规则八种基本数据类型的大小,以及他们的封装类3*0.10.3返回值是什么short s1 1; s1 s1 1;有什么错? short s1 1; s1 1;有什么错?简述&&与&的区别?简述break与continue、return的区别?Arrays类的…

直方图均衡化的本质

Rafael C. Gonzalez “Digital Image Processing”的错误 直方图均衡化的本质是灰度级分布的近邻映射,这部分的内容全错。总有些人崇洋媚外。 我修改了相关的内容,参阅禹晶、肖创柏、廖庆敏《数字图像处理(面向新工科的电工电子信息基础课程…

如何在Linux系统运行RStudio Server并实现无公网IP远程访问【内网穿透】

文章目录 推荐 前言1. 安装RStudio Server2. 本地访问3. Linux 安装cpolar4. 配置RStudio server公网访问地址5. 公网远程访问RStudio6. 固定RStudio公网地址 推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下…

【Leetcode】top 100 二分查找

35 搜索插入位置 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为 O(log n) 的算法。 基础写法!!!牢记…

【算法刷题day14】Leetcode:144.二叉树的前序遍历、94.二叉树的中序遍历、145.二叉树的后序遍历

文章目录 二叉树递归遍历解题思路代码总结 二叉树的迭代遍历解题思路代码总结 二叉树的统一迭代法解题思路代码总结 草稿图网站 java的Deque 二叉树递归遍历 题目: 144.二叉树的前序遍历 94.二叉树的中序遍历 145.二叉树的后序遍历 解析:代码随想录解析…

RN实现全局数据共享(非Redux,使用原生内置的方法实现)

下面这个方法是在RN使用全局数据共享的,使用原生React的方式搞得,相对于Redux配置相对简单,适合小型项目 项目内创建MyContext.js // MyContext.jsimport React from react;const MyContext React.createContext();export default MyContext;App.js引入 // App.jsimport Rea…

在c# 7.3中不可用,请使用9.0或更高的语言版本

参考连接:在c# 7.3中不可用,请使用8.0或更高的语言版本_功能“可为 null 的引用类型”在 c# 7.3 中不可用。请使用 8.0 或更高的语言版本-CSDN博客https://blog.csdn.net/liangyely/article/details/106163660 [踩坑记录] 某功能在C#7.3中不可用,请使用 8.0 或更高的…

大学html作业-大数据分析系统大屏项目(免费)

大学html作业-大数据分析系统大屏项目(免费) 源码来自githab,有些简单的问题我都修复了。大家可以直接去找原作者的源码,如果githab打不开就从我下载的网盘里下载吧。 效果