多线程基础篇
一、预热
1、进程VS线程
1)进程
进程是运行着的程序代码。一个进程只能对应一个程序代码,但一个程序代码可以对应多个进程。直白来说,程序代码是菜谱,进程是厨师烹饪的过程。对于同一个菜谱,可以有多个厨师同时按其制膳。
进程是操作系统分配资源的基本单位,进程之间的资源不共享。两个厨师同时在做清蒸鲈鱼,同一条鲈鱼不可同时被二者使用,因为最后做出来的是两盘,不是一盘。
2)线程
线程是进程的一段执行逻辑,一个进程可以由多个线程组成。厨师在制膳过程中,可能一边在一个锅里熬制浇汤,一边在另一个锅里蒸鱼,可能同时还在案板上制作配菜。
线程是操作系统进行任务调度的基本单位,同一个进程间的线程资源共享,不同进程间的线程资源不共享。
== 进程其实可以看做是承装线程的容器。==
2、并发vs并行
1)并发
并发是指在一段时间内,看起来像多个任务在同时执行。本质上是多个任务使用同一个cpu,但是它们轮流交替使用cpu的时间片,”天下武功唯快不破“,感知上误认为是自己独享cpu。
2)并行
并行是指在同一时间点上,任务在同时执行,即每个任务分别在不同的cpu上执行,是真正的独占cpu。
3、线程和进程的一些分类
主线程和子线程
一个进程只有一个主线程,它是程序的入口。子线程都是由主线程或者由主线程创建的子线程创建的。
父线程和子线程
创建子线程的线程是该子线程的父线程
用户线程和守护线程
用户线程是处理业务逻辑、提供服务的线程。守护线程是为用户线程提供服务的线程,如GC线程、编译优化的C1、C2线程。当全部的用户线程运行结束后,守护线程就会自动终止,无论它执行到什么位置。
僵尸进程和孤儿进程
僵尸进程和孤儿进程都是指子进程。
僵尸进程是指完成了任务但没有被父进程清除掉的子进程。进程存在必留痕,它存在过的痕迹(进程id、进程状态等)是用于报告父进程的。如何清除僵尸进程?干掉它爹,让收容所init进程
接管就成。
孤儿进程是指自己还没执行完毕父进程就已经执行完毕结束了的子进程。孩子没了爹怎么办?交给收容所init进程
来处理就好。
4、查看进程&线程信息的命令和方式
1)windows
【命令行】
- 查看进程
- 查看all
tasklist
- 查看指定
tasklist | findstr 进程名(java)
- 查看all
- 杀死进程
taskkill /F /PID 进程id
【图形化界面】
邮件——任务管理
2)linux
【命令行】
-
查看进程信息
ps
-
查看所有进程
e
的完备信息f
——ps -ef
或者ps -aux
-
查看具体某个进程
ps -ef | grep java
-
按照cpu占用降序排序
ps -aux --sort=-pcpu
-
按内存占用降序排序
ps -aux --sort=-pmem
-