【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在另一个核心上和其他进程的线程来回切换

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

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

  • 一方面,增加线程可以提升任务的解决效率,但另一方面,线程数目如果太多,线程的调度开销也会非常明显,会降低性能
  • 倘若两个线程处理同一个任务,可能会发生冲突,造成线程安全问题
  • 若某一个线程抛出异常,并未及时捕获并处理,则可能导致整个进程的崩溃,所有线程都无法工作
相关推荐
麦兜*1 小时前
Spring Boot 集成 Docker 构建与发版完整指南
java·spring boot·后端·spring·docker·系统架构·springcloud
Cisyam^1 小时前
Go环境搭建实战:告别Java环境配置的复杂
java·开发语言·golang
CHENFU_JAVA2 小时前
使用EasyExcel实现Excel单元格保护:自由锁定表头和数据行
java·excel
青云交3 小时前
Java 大视界 -- 基于 Java 的大数据实时流处理在智能电网分布式电源接入与电力系统稳定性维护中的应用(404)
java·大数据·分布式·智能电网·flink 实时流处理·kafka 数据采集·iec 61850 协议
仰望星空@脚踏实地4 小时前
maven scope 详解
java·maven·scope
M_Reus_114 小时前
Groovy集合常用简洁语法
java·开发语言·windows
带刺的坐椅4 小时前
10分钟带你体验 Solon 的状态机
java·solon·状态机·statemachine
小鹅叻4 小时前
MyBatis题
java·tomcat·mybatis
RainbowSea4 小时前
4. LangChain4j 模型参数配置超详细说明
java·langchain·ai编程
RainbowSea4 小时前
3. LangChain4j + 低阶 和 高阶 API的详细说明
java·llm·ai编程