初步认识线程
概念
一个线程就是一个 "执行流",每一个线程之间都可以按照顺序执行自己的代码,多个线程之间可以 "同步" 执行多份代码
比如说,原本一个人做的事情,现在交给三个人一起做,那么这三个人就是线程
使用原因
那么为什么要有线程呢?我们直接使用进程不可以吗?
-
需求增加,现如今更依赖于并发编程,来充分利用多核CPU
-
取决于任务场景,需要很多任务同时完成,或者避免多余的等待
而线程相较于进程而言:
-
线程是轻量级
-
创建、销毁、调度更快
区别
进程和线程是有一定区别的,同时也存在一些联系
进程是包含线程的
每一个进程都必须至少有一个线程存在,也就是主线程
进程之间不共享内存空间,同一进程内的线程之间是共用所处进程的内存空间的
进程是系统分配资源的最小单位,线程是系统调度的最小单位
我们还可以举一个简单的例子来解释:
假设我们的任务需求是组装汽车,一个人员对应一个组装台,如果此时汽车需求为100,那么这位组装人员就需要一个人组装100台汽车: 但是这样需要花费的时间就很长了
-
添加进程
当一个组装人员来完成这个任务时,我们需要很长的时间,于是此时,我们另外又聘请了一位组装人员B,B和A一样,分配了一个组装台,需要自己组装完整的车,在这种共同执行的条件下,每个人只需要组装50台车就可以完成任务
但是,这样也是有缺点的:
-
每一个人员都需要熟悉完整的组装车的流程,培训的成本也就增加了
-
我们需要为新聘请的人员增加一台新的组装台,需要的占地以及成本就增加了
-
添加线程
为了降低成本,我们还是先聘请人员B,让B和A合作,都在一台组装台进行工作,这样多的内存空间也就省下来了;同时,我们让A和B分别负责组装的一部分(比如一个负责车身,一个负责引擎),这样他们只需要培训他们负责的部分就可以了,培训成本就节省了
那么,我们可不可以为了节省成本不停的加入组装人员呢?
-
添加线程
为了降低成本,我们还是先聘请人员B,让B和A合作,都在一台组装台进行工作,这样多的内存空间也就省下来了;同时,我们让A和B分别负责组装的一部分(比如一个负责车身,一个负责引擎),这样他们只需要培训他们负责的部分就可以了,培训成本就节省了
那么,我们可不可以为了节省成本不停的加入组装人员呢?
代码演示
Java的线程和操作系统的线程是有一定区别的
操作系统: 实现了线程这样的机制,并且对用户层提供了一些API来满足用户的使用
Java: 使用标准库的 Thread类 ,可以看作对操作系统提供的API进行抽象和封装
对于多线程来说: 每一个线程都是一个独立的执行流,线程之间是 "并发" 执行的, 并发不是同时!!!
我们用一个代码来展示一下:
这里的线程就是 main(主线程)、创建的线程t
class MyThread1 extends Thread{@Overridepublic void run(){//这里的代码就是线程要完成的工作//同时这里是一个线程System.out.println("hello world");while (true){System.out.println("thread");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}public class Demo1 {public static void main(String[] args) throws InterruptedException {//这里也是一个线程Thread t = new MyThread1();t.start();//启动新的线程while(true){System.out.println("main");Thread.sleep(1000);}}
}
结果:
thread 和 main 是在并发式(并行/并发-->不确定)的进行
编写代码
创建线程也有很多方法
继承 Thread 类
直接使用 this 就表示当前线程对象的引用
-
创建一个线程类并继承 Thread,继承之后要重写 run() 方法 extends Thread
class MyThread1 extends Thread{@Overridepublic void run(){//代码块}
}
-
创建线程实例,是一个 Thread类,因为继承,所以可以直接创建 MyThread1类,来实现创建 Thread类
Thread t = new MyThread1();
-
启动线程
t.start();//启动新的线程
实现 Runnable 接口
this 表示的是 MyRunnable 的引用,需要使用 Thread.currentThread()
-
实现Runnable接口 implements Runnable
class MyRunnable implements Runnable{@Overridepublic void run(){//代码块}
}
-
创建实例,调用方法启动线程(因为不是继承,所以直接创建的 MyRunnable类 不是 Thread类)
Thread t = new Thread(new MyRunnable());
t.start();
其他创建方法
-
在匿名内部类中创建 Thread 子类对象
Thread t = new Thread(){@Overridepublic void run(){//代码块}
};
t.start();
-
在匿名内部类中创建 Runnable 子类对象
Thread t = new Thread(new Runnable() {@Overridepublic void run() {//代码块
});
t.start();
-
使用 lambda 表达式来创建 Runnable 子类对象
Thread t = new Thread(()->{//代码块
});
t.start();
优缺点
优点
-
提高响应性: 主线程保持响应,避免因耗时任务导致界面卡顿
-
资源利用率高: 线程共享内存和资源,减少资源消耗,适合处理大量并发任务
-
提升性能: 多核CPU上并行执行任务,充分利用硬件资源,加快处理速度
-
简化设计: 将复杂任务分解为多个线程,简化程序结构,便于维护
-
实时处理: 适合实时系统,能够同时处理多个任务,满足实时性要求
缺点
-
复杂性高: 线程同步和资源竞争问题增加了开发和调试难度
-
调试困难: 多线程程序的非确定性行为使得问题难以复现和定位
-
资源竞争: 多个线程访问共享资源时,可能导致死锁或数据不一致
-
上下文切换开销: 频繁的线程切换会消耗CPU资源,影响性能
-
内存消耗: 每个线程需要独立的栈空间,线程过多时会增加内存负担
-
线程安全问题: 需要额外措施(如锁、信号量)来保证数据一致性,增加了复杂性
常见面试题
进程和线程的区别
可以从定义、资源分配、开销、独立性、并发性以及应用场景来回答
进程 | 线程 | |
定义 | 进程是操作系统分配资源的基本单位,是程序的一次执行实例 每个进程有独立的内存空间、文件描述符、系统资源 | 线程是进程内的执行单元,是CPU调度的基本单位 线程共享进程的内存空间和资源,有自己的栈和寄存器 |
资源分配 | 独立的内存和资源 | 共享进程的内存和资源 |
开销(创建、切换) | 较大 | 较小 |
独立性 | 高,进程之间互相隔离 | 低,线程之间共享资源 |
应用场景 | 需要高隔离性的任务 | 需要高并发和资源共享的任务 |
相关文章:
初步认识线程
概念 一个线程就是一个 "执行流",每一个线程之间都可以按照顺序执行自己的代码,多个线程之间可以 "同步" 执行多份代码 比如说,原本一个人做的事情,现在交给三个人一起做,那么这三个人就是线程 使用原因 那么为什么要有线程呢?我们直接使用进程不可以…...
【从零开始学习计算机科学】数字逻辑(一)绪论
【从零开始学习计算机科学】数字逻辑(一)绪论 概论信息与数字数字系统中常用的概念数字信号的描述方法概论 从数字(集成)电路的出现到计算机到网络到今天的移动互联网,数字电路是所有现代信息技术的基础。那么数字电路的基础又是什么呢?就是数字逻辑。所有数字系统都是基…...
Tomcat与Jetty的选择
Tomcat与Jetty的对比分析,分核心区别、性能表现及选型建议三部分: 一、核心区别对比 对比维度TomcatJetty架构设计多层级容器结构(Server→Service→Engine等),复杂度高基于Handler链的轻量级设计,扩展性强…...
用AI学编程2——python学习1
一个py文件,学会所有python所有语法和特性,给出注释,给出这样的文件 Python 学习整合文件 """ Python 学习整合文件 包含 Python 的基础语法、数据结构、函数定义、面向对象编程、异常处理、文件操作、高级特性等内容 每个部…...
【教程】宝塔提示请不要将网站根目录设置到以下关键目录中
【教程】宝塔提示请不要将网站根目录设置到以下关键目录中 【教程】宝塔提示请不要将网站根目录设置到以下关键目录中更换目录解决问题 先在宝塔下载一个 【教程】宝塔提示请不要将网站根目录设置到以下关键目录中更换目录解决问题_起尔网【教程】宝塔提示请不要将网站根目录设…...
html常用的文本标签以及属性
HTML标签 HTML通过一系列的标签(也成为元素),来定义文本,图像,链接等等,HTML标签是由尖括号包围的关键字。 标签通常成对出现,包括开始标签和结束标签(也成为双标签)&a…...
城市霓虹灯夜景拍照后期Lr调色教程,手机滤镜PS+Lightroom预设下载!
调色教程 在城市霓虹灯夜景拍摄中,由于现场光线复杂等因素,照片可能无法完全呈现出当时的视觉感受。通过 Lr 调色,可以弥补拍摄时的不足。例如,运用基本调整面板中的曝光、对比度、阴影等工具,可以处理出画面的整体明暗…...
c#面试题整理
1.如何保持数据库的完整性,一致性 最好的方法:数据库约束(check,unique,主键,外键,默认,非空) 其次是:用触发器 最后:才是自己些业务逻辑,这个效率低 2.事…...
数据库基础以及基本建库建表的简单操作
文章目录 一、数据库是啥1.1、数据库的概念1.1、关系型数据库、非关系型数据库1.1、数据库服务器,数据库与表之间的关系 二、为啥要使用数据库2.1:传统数据文件存储2.2:数据库存储数据2.3、结论 三、使用数据库了会咋样四、应该咋用数据库&am…...
基于spring boot使用@Sl4j的日志功能,注解引入后爆红未生效
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 问题描述问题分析解决方案 📃文章…...
《深度剖析架构蒸馏与逻辑蒸馏:探寻知识迁移的差异化路径》
在人工智能模型优化的前沿领域,架构蒸馏与逻辑蒸馏作为知识蒸馏的关键分支,正引领着模型小型化与高效化的变革浪潮。随着深度学习模型规模与复杂度的不断攀升,如何在资源受限的情况下,实现模型性能的最大化,成为了学术…...
使用OpenCV来获取视频的帧率
在OpenCV中,获取视频的帧率(FPS, Frames Per Second)是一个常见的操作,尤其是在处理视频流或进行视频分析时。帧率表示每秒钟视频中的帧数,这个参数对于视频播放速度和时间计算非常重要。 以下是如何使用OpenCV来获取…...
计算机视觉|3D卷积网络VoxelNet:点云检测的革新力量
一、引言 在科技快速发展的背景下,3D 目标检测技术在自动驾驶和机器人领域中具有重要作用。 在自动驾驶领域,车辆需实时、准确感知周围环境中的目标物体,如行人、车辆、交通标志和障碍物等。只有精确检测这些目标的位置、姿态和类别&#x…...
vue-cli3+vue2+elementUI+avue升级到vite+vue3+elementPlus+avue总结
上一个新公司接手了一个vue-cli3vue2vue-router3.0elementUI2.15avue2.6的后台管理项目,因为vue2在2023年底已经不更新维护了,elementUI也只支持到vue2,然后总结了一下vue3的优势,最后批准升级成为了vitevue3vue-router4.5element…...
Jmeter进行http接口测试详解
🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 本文主要针对http接口进行测试,使用 jmeter工具实现。 Jmeter工具设计之初是用于做性能测试的,它在实现对各种接口的调用方面已经做的比较…...
大模型AI平台DeepSeek 眼中的SQL2API平台:QuickAPI、dbapi 和 Magic API 介绍与对比
目录 1 QuickAPI 介绍 2 dbapi 介绍 3 Magic API 介绍 4 简单对比 5 总结 统一数据服务平台是一种低代码的方式,实现一般是通过SQL能直接生成数据API,同时能对产生的数据API进行全生命周期的管理,典型的SQL2API的实现模式。 以下是针对…...
靶场之路-VulnHub-DC-6 nmap提权、kali爆破、shell反连
靶场之路-VulnHub-DC-6 一、信息收集 1、扫描靶机ip 2、指纹扫描 这里扫的我有点懵,这里只有两个端口,感觉是要扫扫目录了 nmap -sS -sV 192.168.122.128 PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.4p1 Debian 10deb9u6 (protoc…...
nginx服务器实现上传文件功能_使用nginx-upload-module模块
目录 conf文件内容如下html文件内容如下上传文件功能展示 conf文件内容如下 #user nobody; worker_processes 1;error_log /usr/logs/error.log; #error_log /usr/logs/error.log notice; #error_log /usr/logs/error.log info;#pid /usr/logs/nginx.pid;even…...
32.C++二叉树进阶1(二叉搜索树)
⭐上篇文章:31.C多态4(静态多态,动态多态,虚函数表的存储位置)-CSDN博客 ⭐本篇代码:c学习/18.二叉树进阶-二叉搜索树 橘子真甜/c-learning-of-yzc - 码云 - 开源中国 (gitee.com) ⭐标⭐是比较重要的部分…...
RV1126+FFMPEG多路码流监控项目
一.项目介绍: 本项目采用的是易百纳RV1126开发板和CMOS摄像头,使用的推流框架是FFMPEG开源项目。这个项目的工作流程如下(如上图):通过采集摄像头的VI模块,再通过硬件编码VENC模块进行H264/H265的编码压缩,并把压缩后的…...
doris: SQL Server
Doris JDBC Catalog 支持通过标准 JDBC 接口连接 SQL Server 数据库。本文档介绍如何配置 SQL Server 数据库连接。 使用须知 要连接到 SQL Server 数据库,您需要 SQL Server 2012 或更高版本,或 Azure SQL 数据库。 SQL Server 数据库的 JDBC 驱动…...
valgrind 检测多线程 bug,检测 并发 bug concurrent bug parallel bug
valgrind --toolhelgrind ./your_program 如果检测的对象是大型程序,可以设定仅在某些函数中开启 valgrind 的检测: Valgrind 提供了一些客户请求(client requests),可以在代码中插入特定的宏来控制 Valgrind 的行为。…...
查看k8s集群的资源使用情况
查看Kubernetes(k8s)集群的资源使用情况有多种方法,以下是一些常见的方式: 使用kubectl命令行工具 查看节点资源使用情况 kubectl top nodes命令可以显示集群中各个节点的CPU和内存使用情况。例如: NAME …...
在 k8s中查看最大 CPU 和内存的极限
在 Kubernetes(k8s)中,你可以从不同层面查看最大 CPU 和内存的极限,下面为你详细介绍从节点和集群层面查看的方法。 查看节点的 CPU 和内存极限 节点的 CPU 和内存极限是指单个节点上可分配的最大资源量,可通过以下几…...
IDC权威认证!永洪科技入选 IDC「GBI图谱」,点亮生成式 BI 价值灯塔
大数据市场正在稳步前进,生成式AI已成为厂商服务的重点方向,其发展离不开数据底座建设和数据工程管理,反过来AI也会帮助开发运维人员、业务人员和管理层更好地使用、查询数据。IDC调研数据显示,在生成式AI的驱动下,未来…...
HarmonyOS 应用程序包结构 (编译态)
不同类型的Module编译后会生成对应的HAP、HAR、HSP等文件,开发态视图与编译态视图的对照关系如下: 从开发态到编译态,Module中的文件会发生如下变更: ets目录:ArkTS源码编译生成.abc文件。resources目录:A…...
C# 程序结构
C#的程序结构大体可以分为: 命名空间、类名、Main方法、标识符及关键字语句注释 C# 文件的后缀为 .cs 以下创建一个HelloWorld的类,可以看一下 using System; namespace HelloWorldApplication //命名空间 {class HelloWorld //类名{static void …...
LLM 学习(二 完结 Multi-Head Attention、Encoder、Decoder)
文章目录 LLM 学习(二 完结 Multi-Head Attention、Encoder、Decoder)Self-Attention (自注意力机制)结构多头注意力 EncoderAdd & Norm 层Feed Forward 层 EncoderDecoder的第一个Multi-Head AttentionMasked 操作Teacher Fo…...
GET3D:从图像中学习的高质量3D纹理形状的生成模型
【摘要】 本文提出了GET3D,这是一种新的生成模型,能够生成具有任意拓扑结构的高质量3D纹理网格,可以直接被3D渲染引擎使用并在下游应用中立即使用。现有的3D生成模型要么缺乏几何细节,要么生成的网格拓扑受限,通常不支持纹理,或者在生成过程中使用神经渲染器,使得它们在…...
JmeterHttp请求头管理出现Unsupported Media Type问题解决
JmeterHttp请求头管理出现Unsupported Media Type问题解决 大多数的app与pc端压测的时候都会出现这种情况 当我们在jemter测试当中当中遇见Unsupported Media Type,有一种可能就是我们请求的网页的content-Type的类型与我们测试的时候的类型不一致 解决方法 可以添…...
Python 性能优化:从入门到精通的实用指南
Langchain系列文章目录 01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…...
Vue23Web 基礎性拉滿的面試題(2025版)還沒更新完...
Vue2&3 基礎性1. 關於Vue2和Vue3生命週期的差別2. Vue2&3組件之間傳參不同點Vue2 傳遞與接收Vue3 傳遞與接收 (使用script setup語法糖)Vue3 傳遞與接收 (不使用script setup語法糖) 3. Vue2&3 keep-alive 組件Vue2 keep-aliveVue3 keep-alive 進階性爲什麽POST請求…...
Python基于Django的医用耗材网上申领系统【附源码、文档说明】
博主介绍:✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&…...
STM32使用无源蜂鸣器
1.1 介绍: 有源蜂鸣器:内部自带振荡源,将正负极接上直流电压即可持续发声,频率固定 无源蜂鸣器:内部不带振荡源,需要控制器提供振荡脉冲才可发声,调整提供振荡脉冲的频率,可发出不同…...
9.1go结构体
Go不是完全面向对象的,没有类的概念,所以结构体应该承担了更多的责任。 结构体定义 使用 type 和 struct 关键字定义: type Person struct { Name string Age int } 字段可以是任意类型,包括其他结构体或指针。 字段名以大写…...
Ubuntu20.04本地配置IsaacLab 4.2.0的G1训练环境(一)
Ubuntu20.04本地配置IsaacLab的G1训练环境(一) 配置Omniverse环境配置IsaacSim配置IsaacLab 写在前面,如果Ubuntu剩余空间低于60G,则空间不足,除非你不需要资产包。但资产包中却包含了G1模型、Go2模型等机器人模型和代…...
全星FMEA软件:汽车电子行业研发管理高效之选
全星FMEA软件:汽车电子行业研发管理高效之选 在汽车电子行业,FMEA(失效模式与影响分析)是确保产品质量和安全的关键工具。然而,传统的FMEA分析过程往往繁琐复杂,耗费大量时间和精力。 全星FMEA软件应运而生…...
AGI 之 【Dify】 之 使用 Docker 在 Windows 端本地部署 Dify 大语言模型(LLM)应用开发平台
AGI 之 【Dify】 之 使用 Docker 在 Windows 端本地部署 Dify 大语言模型(LLM)应用开发平台 目录 AGI 之 【Dify】 之 使用 Docker 在 Windows 端本地部署 Dify 大语言模型(LLM)应用开发平台 一、简单介绍 二、Docker 下载安…...
OpenCV计算摄影学(18)平滑图像中的纹理区域同时保留边缘信息函数textureFlattening()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::textureFlattening 是 OpenCV 中用于图像处理的一个函数,旨在平滑图像中的纹理区域,同时保留边缘信息。该技术特别适…...
RLock类详细介绍、应用场景和示例代码
概述 org.redisson.api.RLock 是 Redisson 提供的 分布式可重入锁(类似 ReentrantLock),基于 Redis 实现,常用于 分布式环境 下的 并发控制。 1. RLock 详解 🔹 特点 基于 Redis 实现,支持 集群环境。可…...
【HeadFirst系列之HeadFirst设计模式】第16天之生成器模式(Builder Pattern):让对象构建更优雅!
🚀 生成器模式(Builder Pattern):让对象构建更优雅! “遇到复杂对象构建?试试生成器模式!” 在日常开发中,我们经常会遇到 创建对象属性过多、构造方法过长、可选参数混乱 的问题。这…...
Browser Use+DeepSeek的使用教程
browser-use webui 主要功能 提供了全新的网页界面,简单好用,方便操作。 支持更多大语言模型,比如 Gemini、OpenAI、Azure 等,还有最近爆火的国产大模型 DeepSeek,未来还会加更多。 支持用自己的浏览器,不用…...
“此电脑”中删除WPS云盘方法(百度网盘通用)
📣此方法适用于卸载WPS云盘后,WPS云盘图标依然在此电脑中显示的问题。 原理:通过注册来进行删除 步骤: WIN键R,打开运行窗口,输入regedit命令,来打开【注册表编辑器】; 从左侧,依…...
1. 树莓派上配置机器人环境(具身智能机器人套件)
1. 安装树莓派系统 镜像下载地址(windows/Mac/Ubuntu),安装Pi5. 2. 环境配置(登录Pi系统) 2.1 启用 SSH From the Preferences menu, launch Raspberry Pi Configuration. Navigate to the Interfaces tab. Select Enable…...
正则表达式(2)匹配规则
正则表达式的匹配规则定义了如何识别字符串中的特定模式。这些规则包括字符类匹配、元字符匹配、数量词、字符转义和分组。 字符类匹配 字符类匹配允许你指定一个字符集合,并匹配该集合中的任意单个字符。这是通过方括号 [] 来实现的。 简单字符类:[abc…...
Golang实践录:go发布版本信息收集
go发布版本信息收集。 背景 本文从官方、网络资料收罗有关go的发布历史概况。主要目的是能快速了解golang不同版本的变更。鉴于官方资料为英文,为方便阅读,使用工具翻译成中文,重要特性参考其它资料补充/修改。由于发布版本内容较多…...
go:windows环境下安装Go语言
1.下载 打开Go语言中文网下载页面: https://studygolang.com/dl 按照对应平台选择下载: https://studygolang.com/dl/golang/go1.19.2.windows-amd64.msi。 2.安装 双击下载好的文件 记下安装路径,删除末尾的反斜杠: C:\Program…...
遵义市招生管理信息系统的开发与实现
近年来,随着信息技术的发展,各类管理系统在教育领域得到广泛应用。本文将介绍如何开发一个基于Web的招生管理信息系统,以提高遵义市招生工作的效率和透明度。 系统架构设计 本系统采用典型的三层架构,包括表示层、业务逻辑层和数…...
Java 大视界 -- 区块链赋能 Java 大数据:数据可信与价值流转(84)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
Pytest自动化框架
目录 Pytest简单介绍 第一章:Pytest console命令 1.pytest -v 参数 -h 参数 其他一些参数:仅供参考 第二章. mark标记 pytest.mark.skip pytest.mark.skipif pytest.mark.xfail 编辑 pytest.mark.patametrize 单个参数 多个参数 直接…...