什么是进程

进程(Process)是程序运行的实例,如运行腾讯视频客户端就是一个进程。进程和程序之间的关系就好比播放电影中的视频,如大话西游这部电影对应的mp4之间的关系。运行一个Java程序实质是启动了一个Java虚拟机进程(JVMProcess),也就是说运行Java程序就是一个进程。

  1. public class ProcessMain {
  2. public static void main(String [] args) {
  3. while(true) {
  4. System.out.println("Hello Process");
  5. }
  6. }
  7. }

上面这个程序就是一个进程,当我们把这个程序通过打包成jar包,然后丢到我们的linux操作系统上运行,通过linux命令 ps -ef|grep “ProcessMain” | grep -v “grep” 就能找到这个进程,进程是程序向我们的操作系统申请资源如内存

什么是线程

线程是程序执行的最小单位,一个进程最少有一个线程,当我们每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵。而线程是共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多。

线程和进程的区别

注意同一进程下的线程贡献全局变量、静态变量等数据,但是进程之间通信需要以通信等方式如ICP进行,在多线程程序员中一个线程挂掉如果没有retry重试机制那么整个进程就死掉了,而进程死掉并不会对另一个进程造成任何影响,每个进程有自己对独立空间也就是地址

为什么要使用多线程,它解决了什么问题

image.png
如上图所示,用户下单,耗费50毫秒,然后订单服务分别去发送短信、email、app-push,各50毫秒,而加起来200毫秒,这里也就是同步操作,每一个操作步骤必须完成后,下一个才能执行,效率低,无法满足互联网当下的高并发。
image.png
我们可以通过使用多线程的方式,在里面加一个线程池,如上图所示,加完多线程后,在下订单完成后,就异步去发消息(短信服务、email服务、app-push服务),但是这里是有一个优化过的地方,那就是下完订单后,可以不用等待150毫秒,因为这里是异步的

总结

多线程解决了效率低,使同步变成异步,多个协同来完成业务,使业务达到标准化,提升并发量