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

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

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

  • 一方面,增加线程可以提升任务的解决效率,但另一方面,线程数目如果太多,线程的调度开销也会非常明显,会降低性能
  • 倘若两个线程处理同一个任务,可能会发生冲突,造成线程安全问题
  • 若某一个线程抛出异常,并未及时捕获并处理,则可能导致整个进程的崩溃,所有线程都无法工作
相关推荐
guestsun1 小时前
SpringBoot七大事务失效场景分析
java·spring boot·mybatis
毕设源码-邱学长7 小时前
【开题答辩全过程】以 基于Java的学校住宿管理系统的设计与实现为例,包含答辩的问题和答案
java·开发语言
兑生9 小时前
【灵神题单·贪心】1481. 不同整数的最少数目 | 频率排序贪心 | Java
java·开发语言
daidaidaiyu9 小时前
一文学习 Spring 声明式事务源码全流程总结
java·spring
零雲10 小时前
java面试:了解抽象类与接口么?讲一讲它们的区别
java·开发语言·面试
左左右右左右摇晃13 小时前
Java并发——synchronized锁
java·开发语言
sxlishaobin13 小时前
Java I/O 模型详解:BIO、NIO、AIO
java·开发语言·nio
彭于晏Yan14 小时前
Spring AI(二):入门使用
java·spring boot·spring·ai
有一个好名字14 小时前
vibe codeing 开发流程
java
兑生14 小时前
【灵神题单·贪心】3745. 三元素表达式的最大值 | 排序贪心 | Java
java·开发语言