【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 小时前
Java导出写入固定Excel模板数据
java·导出数据·easyexcel·excel固定模板导出
摇滚侠1 小时前
Spring Boot3零基础教程,KafkaTemplate 发送消息,笔记77
java·spring boot·笔记·后端·kafka
fat house cat_4 小时前
【netty】基于主从Reactor多线程模型|如何解决粘包拆包问题|零拷贝
java·服务器·网络·netty
青云交5 小时前
Java 大视界 -- Java 大数据在智能教育学习社区互动模式创新与用户活跃度提升中的应用(426)
java·大数据·学习·flink 实时计算·智能教育社区·互动模式创新·用户活跃度
神奇的海马体5 小时前
Tomcat隐藏版本号
java·tomcat
拜见老天師5 小时前
使用mybatis-plus,实现将排序时,字段值为NULL的数据排在最后
java·mybatis
应茶茶5 小时前
C++11 核心新特性:从语法重构到工程化实践
java·开发语言·c++
Reggie_L6 小时前
RabbitMQ -- 高级特性
java·rabbitmq·java-rabbitmq
lang201509287 小时前
Spring空安全指南:告别空指针异常
java·安全·spring