线程与进程:高效并发编程的核心奥秘
今天就主要来讲一下进程和线程部分的知识点希望对于学习JUC的你会有所帮助进程与线程的简单介绍进程首先我们先来简单的讲一讲什么是进程进程我们可以理解为我们电脑上的一个个应用实例当我们双击打开这个应用的时候就相当于是启动了一个进程。接着是这个应用程序肯定是有很多的指令和数据的吧这些指令如果想要去执行那么就必须要把指令加载到CPU执行数据加载到内存有的应用程序还需要用到联网和磁盘因此指令在运行的过程中还需要用到网络磁盘等设备【这个部分如果往下深入就是到了操作系统部分了在此处暂时不考虑往下进行延申后续会开操作系统的专栏】综上进程就是用来加载执行指令管理内存管理IO【磁盘的写入和读出】线程一个进程在运行的过程中是需要完成一系列的任务的那么我们是不是可以考虑将大任务去分解成一个个小任务让手底下的小线程去完成这一个个子任务即可所以一个进程之内可以分为多个线程一个线程就是一个指令流将指令流中的一条条指令交给CPU去执行让线程去完成这一个个的小任务java中线程作为最小的调度单位进程作为资源分配的最小单位在windows中进程是不活动的只是作为线程的容器二者对比进程之间是相互独立的而线程是存在于进程内部的类比进程是一个大的车间线程是里面的一个个小员工每个员工负责一个子任务共同来完成车间的大任务进程拥有共享的资源在这个进程内的线程之间的资源都是共享的比如内存空间和资源类比车间里面的 补给品和空调/风扇都是这个车间内的工作人员所共享的进程间的通信是比较复杂的同一台计算机进程之间的通信为IPC不同机器之间的进程通信需要通过网络并遵守共同的协议比如HTTPTCP等协议【涉及到计算机网络的知识点了后续深入的话也会开一个专栏来讲这个部分的知识点】线程间的通信注意这个也是要分情况的如果是不同进程内的线程进行通信的话代价还是比较大的【毕竟都不是一个车间内的人还需要去到别的车间和其他人进行交流还需要经过一系列的安检和检查还是比较麻烦的】如果线程间的通信是在同一个进程下的话就相对比较简单了因为同一个进程下的线程是共享内存空间的线程的上下文切换更加的轻量线程的上下文切换的代价比进程的上下文切换要小补充什么是上下文切换这里先简单的讲一下就是在CPU内部是通过时间片轮转的方式来分配的比如线程1占用了时间片1在这个时间片内去执行任务但是经过了这个时间段之后线程1的任务还没有执行完这个时候操作系统就告诉线程1你的时间用完了该换到其他的线程来执行任务了那么这个时候线程1是不是要记录一下当前线程的执行情况当前任务进行到了一个什么样的程度保存下来【像我们读书的时候如果突然有事是不是要记下一个书签有空了直接从这个书签位置记录处开始读】然后准备切换到下一个线程线程2这个时候来了是不是需要加载当前线程的一些执行任务所需要的资源保存线程1的数据开始执行线程2的任务这个部分呢还是有点小复杂的后续在讲操作系统的时候会深入的去聊一下这个部分在这里可以简单的理解一下就好上下文切换就是切换执行任务的过程并行与并发并行就是物理上的多个任务来同时进行执行的过程并发在单核CPU上通过时间片轮转的方式来轮流执行一个个的小任务但是为什么我们觉得即使在单核CPU的电脑上我一遍写文章一遍听歌看起来是并行的但实则在单核CPU内部是通过时间片轮转的方式来轮流执行的为什么我们感知不到呢因为每一个时间片的时间都是非常短的因此在切换的时候一般是感知不到的单核CPU的情况下多核CPU的情况下在多核CPU的情况下只要线程数量比CPU内核的数量要多的话那么CPU就是并行并发一块执行的【因为难免会在线程之间进行来回的切换操作】应用应用之异步调用思考如果在业务开发的代码当中需要进行IO操作的话可以考虑使用多线程工具来进行优化比如我新开一个线程来专门地去处理这个调度任务不需要CPU进行等待操作那么我是不是可以类比凡是占用CPU时间比较长的工作我能不能都开启一个新的线程去专门执行这个任务然后主线程留着去执行重要的业务代码和逻辑异步编程主要是用在对于结果要求本身不是很严格的环境当中去进行的【并不要求我必须先算出结果才能往下继续运行】黑马点评下单回顾像我们前面学习过的黑马点评项目在下单的时候就是用到了这个技术回顾一下当时的场景如果一个时间段内一下子有上千万的请求打过来我们数据库肯定是扛不住的因此我们可以考虑引入redis来进行一个缓冲来降低数据库的压力但是用户的整个下单流程是非常长的在整个系统中的业务线非常的长我们是不是可以考虑一下对这个业务线进行适当的裁剪于是我们对用户实际下单扣减库存通知发货的部分可以进行一个异步操作处理这个时候就可以引入消息队列来帮助我们起到一个削峰填谷的作用按照数据库可以接受的方式来写入数据不至于一下子把数据库打宕机整个的思想就是一个异步操作后续会开一个专栏专门来讲一下有关于消息队列的知识点在这里展示的是异步操作异步进行执行的话【这里是开了一个新线程】可以观察到在此处两个线程是同一时刻开始并行执行的应用之提高效率举个例子在这里如果是多核CPU的话开启多个线程来执行任务会相对的更快一些如果是单核CPU的话如果同样是开启了多核来进行对应的任务执行任务的速度反而是会下降因为在单核CPU当中如果开启了多个线程是需要进行线程之间的上下文切换导致浪费了大量的时间【图片】