【JavaEE】多线程(一)

一、线程

通过前面的内容我们已经知道,计算机中运行的程序都是由操作系统来管理的,进程则是操作系统分配资源的基本单位,为了提升CPU的运行效率,我们采用分时复用、多线程等方法进行多个程序的并发、并行执行。

我们知道,通过多进程编程的方式,可以实现"并发编程"的效果,这种方法常被用于服务器开发中。当客户端发出一个请求,服务器端就会创建一个新的进程并分配资源给客户端进行相应。但是问题在于,创建进程和销毁进程耗费的资源较多,如果对于每个客户端的每次请求服务器都为其创建一个新的进程进行服务,那势必会产生大量开销。为了解决上述问题,引入线程这一概念

可以这样理解,线程就是轻量级的进程,它的创建和销毁所需开销更小。每个进程都相当于一个要执行的任务;每个线程也是一个要执行的任务(也就是运行的一段代码指令)

线程和进程最重要的区别在于:进程包含线程,每个进程中都会包含一个或者多个线程

1. 进程是操作系统资源分配的基本单位

前文提到,进程是操作系统资源分配的基本单位,所谓资源,就是CPU、内存、硬盘资源(文件描述符表)、网络带宽等。

进程和线程之间的资源分配可以概括为以下几点:

  1. 进程内部管辖的多个线程之间,会共享上述的内存资源和硬盘资源、网络带宽......
  2. 不同进程之间所涉及的资源则是相互独立的,彼此之间互不干扰
  3. 进程的创建和销毁需要申请、释放资源
  4. 对于线程来说,只有第一个线程创建的时候(和进程一起创建的时候)申请资源,后续再创建线程,不涉及资源申请操作
  5. 只有所有的线程都销毁(进程销毁)后才会真正释放资源,运行过程中销毁某个线程,不会释放资源

嘿嘿,是不是有点绕晕了,可以这样理解,CPU是一个工厂,进程是工厂中不同的流水线,每一条流水线上都拥有一定的机器和原料(资源)用来加工,线程则是流水线上的工人,轮流在这条流水线上工作,每条流水线的工人使用的都是这条流水线上的资源

2. 线程是CPU上调度执行的基本单位

CPU好比是一个大舞台,每个线程都是无赖上的演员,每个线程都有去舞台上表演的机会,线程再CPU上执行的过程和前文link提到的进程调度是一样的

如果一个进程包含多个线程,此时多个线程之间会各自去CPU上调度执行

举个例子,一个进程里有线程1,2,3

有一种可能,线程1去CPU核心1上执行,线程2去CPU核心2上执行,线程3去CPU核心3上执行(并行)

也有可能,线程1,线程2,线程3在一个核心上来回切换(并发)

还有可能,线程1、2在一个核心上来回切换,线程3在另一个核心上和其他进程的线程来回切换

具体线程怎么调度执行,是由操作系统内部"调度器"自行完成的,作为程序员不需要关注太多

但是,这样的多线程执行也会存在一些问题

  • 一方面,增加线程可以提升任务的解决效率,但另一方面,线程数目如果太多,线程的调度开销也会非常明显,会降低性能
  • 倘若两个线程处理同一个任务,可能会发生冲突,造成线程安全问题
  • 若某一个线程抛出异常,并未及时捕获并处理,则可能导致整个进程的崩溃,所有线程都无法工作
相关推荐
一枕槐安4877 分钟前
大模型应用后端设计:上下文管理、缓存、降级策略的工程方案总结
java·spring·缓存
T_Apollo7 分钟前
2.9 Java 25 版本新增特性和类
java
步行cgn22 分钟前
@RequestMapping 注解详解
java·后端·spring
鶴哥只手遮天23 分钟前
Spring Boot 4.1.1 深度源码解析-第 15 章 · 条件注解体系:全部 `@ConditionalOnXxx` 的实现原理
java·后端·开源
鶴哥只手遮天24 分钟前
Spring Boot 4.1.1 深度源码解析-第 30 章 · 基础设施能力:SSL Bundle、Task 与虚拟线程、Retry
java·后端·开源
IT研究室25 分钟前
最新计算机毕业设计选题推荐-基于微信小程序的汉服交易系统-网站-文档指导-Java-springboot
java·微信小程序·课程设计
鶴哥只手遮天28 分钟前
Spring Boot 4.1.1 深度源码解析-第 26 章 · 指标、观测与链路追踪:Micrometer 与 OpenTelemetry
java·后端·开源
Wang's Blog31 分钟前
Java 项目实战: 交友项目 - 章节复盘:微服务骨架与手机号验证码登录
java·微服务·交友
data analyse 45636 分钟前
Session数怎么计算?明确会话切分、超时与跨页规则
java·服务器·数据库
鶴哥只手遮天39 分钟前
Spring Boot 4.1.1 深度源码解析-第 19 章 · Spring MVC 自动配置:DispatcherServlet、消息转换
java·后端·开源