进程与线程
进程(Process)是系统进行资源分配和调度的基本单位,是线程的容器。
线程(thread) 是操作系统能够进行运算调度的最小单位,被包含在进程之中。一条线程指的是进程中一个单一顺序的控制流, 一个进程中可以并发多个线程,每条线程并行执行不同的任务。
线程状态枚举
NEW
RUNNABLE
BLOCKED
WAITING
TIMED_WATING
TERMINATED
wait/sleep 的区别
- sleep 是 Thread 的静态方法,wait 是 Object 的方法。
- sleep 不会释放锁,它也不需要占用锁。wait 会释放锁,但调用它的前提是当前线程占有锁(即代码要在 synchronized 中)。
- 它们都可以被 interrupted 方法中断。
并发与并行
串行
串行是一次只能取得一个任务,并执行这个任务,按先后顺序进行。
并行
并行意味着可以同时取得多个任务,并同时去执行所取得的这些任务,每个CPU都有分配任务。依赖于多核 CPU。
并发
并发也是多个任务同时运行,但却是同一个CPU轮流执行多个进程。谁分配到CPU执行时间片,谁就执行,时间到了就从用户态切换回内核态,保存现场。轮到另一个线程执行,恢复它上次保存的现场,从内核态切换回用户态,继续执行。所以进程程序看起来是“同时执行”。
用户线程和守护线程
用户线程:平时用到的普通线程,自定义线程
守护线程:运行在后台,是一种特殊的线程,比如垃圾回收
当主线程结束后,用户线程还在运行,JVM 继续存活。
如果没有用户线程,都是守护线程,JVM 结束。
|
|
new Thread()
默认是用户线程
线程堵在 while (true) {}
这里,JVM不终止。
只有手动设置 daemon 为 true 时,才算守护进程
|
|