当前位置: 首页 > news >正文

<JavaEE> 什么是线程(Thread)?进程和线程有什么区别?

目录

一、线程(Thread)的概念

二、线程存在的意义

2.1 并发编程

2.2 比进程更“轻量”

三、使用线程时应该注意

四、进程和线程的区别

五、Java中的线程和操作系统中的线程是不同的概念

六、多线程编程


一、线程(Thread)的概念

线程是操作系统中实现并发编程的一种基本结构。
线程可以被看作是运行在操作系统中的一个独立的工作单元,⼀个线程就是⼀个 "执行流"。
每个线程之间都可以按照顺序执行自己的代码。多个线程之间 "同时" 执行着多份代码。
线程的创建和执行由操作系统负责管理,程序员只需要提供线程执行的任务。
一个进程中可以有多个线程。每个线程也是由一个进程控制块(PCB)进行描述的。

阅读指针 -> 《什么是进程控制块(PCB Process Control Block)?》

<JavaEE> 什么是进程控制块(PCB Process Control Block)?-CSDN博客文章浏览阅读23次。介绍进程控制块和进程控制块的核心属性。进程控制块适用于进程,也适用于线程。https://blog.csdn.net/zzy734437202/article/details/134583750


二、线程存在的意义

2.1 并发编程

线程可以提高程序的并发性能,充分利用多核CPU的资源。
特别是在处理I/O密集型任务时,有些场景需要等待IO,在等待IO时,可以将系统资源调度给其他任务使用。
当程序需要执行多个任务时,线程可以同时处理这些任务,从而提高程序的执行效率。

2.2 比进程更“轻量”

进程也可以进行并发编程,但线程比进程更轻量,线程在创建、调度和销毁上,都要比进程快。
所以线程可以减轻CPU的负担,提高程序的响应速度。
线程保持了独立调度执行,支持并发的同时,省去了“分配资源”和“释放资源”带来的额外开销。这意味着只有在第一个线程,也就是进程创建时才需要申请系统资源,后续线程的创建则不再需要重新申请系统资源了。

三、使用线程时应该注意

注意以下几点说明
线程并非越多越好线程数量太多时,会加剧线程间对有限的CPU资源的竞争,这增加了资源调度的开销,降低了执行效率。
资源共享存在副作用进程和进程之间不会互相影响,但如果同一个进程中的某一个线程抛出异常,这个进程中的其他线程也会受到影响,这就可能导致整个进程异常终止。
线程安全问题线程之间可能互相干扰冲突,导致代码出现逻辑错误。线程安全问题也是并发编程的重点和难点。

四、进程和线程的区别

(1)进程包含线程。每一个进程至少有一个线程,这个线程被称为主线程。
(2)进程和进程之间不共享内存空间,每个进程都有自己的资源。同一个进程的线程之间共享同一分资源,如内存空间、文件描述符表等,每个线程都是一个独立的执行流,单独参加到CPU的调度中。
(3)进程是系统分配资源的最小单位,线程是系统调度的最小单位。
(4)一个进程发生异常一般不会影响到其他进程。但是一个线程出现异常,则可能导致同进程内的其他线程也发生异常,最终可能导致包含这个线程的进程也出现异常。

五、Java中的线程和操作系统中的线程是不同的概念

操作系统中的线程线程是操作系统中的概念。操作系统内核实现了线程机制,并对用户岑提供了供用户使用的线程相关API。
Java中的线程Java标准库中的Thread类是对操作系统提供的API进行了进一步的抽象和封装。

六、多线程编程

多线程程序和非多线程程序的区别和优势在于,多线程每个线程都是一个独立的执行流,多个线程可以并发执行,增加了程序运行速度,提高了程序的运行效率。
许多语言都是支持多进程并发编程,也支持多线程并发编程。但是,在Java中,更鼓励多线程并发编程。
因为在Java标准库中,很多多进程编程的相关API都没有提供,而多线程编程的API都有封装提供。
更重要的是,在Java中每启动一个进程,就要启动一次Java虚拟机,这加大了多进程编程的系统开销。
因此在Java中,更推荐多线程并发编程。

阅读指针 -> 《介绍 创建和查看线程的方法》

<JavaEE> 线程的五种创建方法 和 查看线程的两种方式-CSDN博客文章浏览阅读12次。介绍java中,线程的五种创建方法 和 查看线程的两种方式。https://blog.csdn.net/zzy734437202/article/details/134621328

相关文章:

  • 性能优化中使用Profiler进行内存泄露的排查及解决方式
  • Linux 中的 ls 命令使用教程
  • anacoda 在 git 远程仓库的时候遇到 SSL 无法访问和字节缓冲太小和换源以及无法连接到官网和字节写入冲突
  • Linux——使用命令查看文件和文件夹数量
  • react项目自行配置热更新
  • 1-1、汇编语言概述
  • 【Python】巧用tkinter设计秒表计时器
  • linux下的工具---vim
  • 电力感知边缘计算技术网关产品设计方案-硬件方案
  • Kafka 集群如何实现数据同步
  • mysql使用--存储程序
  • 切换服务器上自己用户目录下的 conda 环境和一个外部的 Conda 环境
  • AMEYA360:村田首款1608M尺寸/100V静电容量1µF的MLCC实现商品化
  • 【Leetcode合集】1410. HTML 实体解析器
  • C语言键盘输入字符串小写转大写输出及scanf的小问题解决
  • C++类中的特殊成员函数
  • C语言笔记(第一章:C语言编程)
  • fetch 从初识到应用
  • iOS编译提示和导航提示
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • Java应用性能调优
  • js学习笔记
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • PAT A1120
  • scrapy学习之路4(itemloder的使用)
  • Vue UI框架库开发介绍
  • 关于 Cirru Editor 存储格式
  • 试着探索高并发下的系统架构面貌
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 数据仓库的几种建模方法
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • ​iOS实时查看App运行日志
  • #Linux(Source Insight安装及工程建立)
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (转) Android中ViewStub组件使用
  • (转)iOS字体
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • (轉貼)《OOD启思录》:61条面向对象设计的经验原则 (OO)
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • .NET/C# 编译期间能确定的相同字符串,在运行期间是相同的实例
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递
  • [<MySQL优化总结>]
  • [2017][note]基于空间交叉相位调制的两个连续波在few layer铋Bi中的全光switch——
  • [20171102]视图v$session中process字段含义
  • [2023年]-hadoop面试真题(一)
  • [Android]使用Retrofit进行网络请求
  • [C# 开发技巧]实现属于自己的截图工具
  • [Contiki系列论文之2]WSN的自适应通信架构