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

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

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

  • 一方面,增加线程可以提升任务的解决效率,但另一方面,线程数目如果太多,线程的调度开销也会非常明显,会降低性能
  • 倘若两个线程处理同一个任务,可能会发生冲突,造成线程安全问题
  • 若某一个线程抛出异常,并未及时捕获并处理,则可能导致整个进程的崩溃,所有线程都无法工作
相关推荐
杨章隐14 分钟前
Java 解析 CDR 文件并计算图形面积的完整方案(支持 MultipartFile / 网络文件)@杨宁山
java·开发语言
Renhao-Wan26 分钟前
Java 并发基石:AQS (AbstractQueuedSynchronizer)
java·开发语言
zlp19921 小时前
xxl-job java.sql.SQLException: interrupt问题排查(二)
java·开发语言
sunnyday04261 小时前
深入理解Java日志框架:Logback与Log4j2配置对比分析
java·log4j·logback
浩瀚地学1 小时前
【Java】异常
java·开发语言·经验分享·笔记·学习
张np1 小时前
java基础-LinkedHashMap
java·开发语言
毕设源码-朱学姐1 小时前
【开题答辩全过程】以 高校图书馆管理系统为例,包含答辩的问题和答案
java
xie_pin_an1 小时前
C++ 从入门到进阶:核心知识与实战指南
java·c++·算法
Wpa.wk1 小时前
性能测试-初识性能测试基础(性能测试流程,计划等)
java·运维·经验分享·测试工具·性能测试
小鸡脚来咯1 小时前
Java 关键字面试解释指南
java