用户线程和守护线程

进程与线程

进程(Process)是系统进行资源分配和调度的基本单位,是线程的容器。

线程(thread) 是操作系统能够进行运算调度的最小单位,被包含在进程之中。一条线程指的是进程中一个单一顺序的控制流, 一个进程中可以并发多个线程,每条线程并行执行不同的任务。

线程状态枚举

NEW

RUNNABLE

BLOCKED

WAITING

TIMED_WATING

TERMINATED

wait/sleep 的区别

  1. sleep 是 Thread 的静态方法,wait 是 Object 的方法。
  2. sleep 不会释放锁,它也不需要占用锁。wait 会释放锁,但调用它的前提是当前线程占有锁(即代码要在 synchronized 中)。
  3. 它们都可以被 interrupted 方法中断。

并发与并行

串行

串行是一次只能取得一个任务,并执行这个任务,按先后顺序进行。

并行

并行意味着可以同时取得多个任务,并同时去执行所取得的这些任务,每个CPU都有分配任务。依赖于多核 CPU。

并发

并发也是多个任务同时运行,但却是同一个CPU轮流执行多个进程。谁分配到CPU执行时间片,谁就执行,时间到了就从用户态切换回内核态,保存现场。轮到另一个线程执行,恢复它上次保存的现场,从内核态切换回用户态,继续执行。所以进程程序看起来是“同时执行”。

用户线程和守护线程

用户线程:平时用到的普通线程,自定义线程

守护线程:运行在后台,是一种特殊的线程,比如垃圾回收

当主线程结束后,用户线程还在运行,JVM 继续存活。

如果没有用户线程,都是守护线程,JVM 结束。

val t = new Thread(() => {
println(s"线程${Thread.currentThread().getName},daemon: ${Thread.currentThread().isDaemon}")
// 死循环
while (true) {}
}, "aa")
t.start()
println(s"线程${Thread.currentThread().getName}结束")
【信息】 - 2021-11-08T20:50:58.268184200: 线程main结束
【信息】 - 2021-11-08T20:50:58.268184200: 线程aadaemon: false

new Thread() 默认是用户线程

线程堵在 while (true) {} 这里,JVM不终止。

只有手动设置 daemon 为 true 时,才算守护进程

val t = new Thread(() => {
logger.info(s"线程${Thread.currentThread().getName},daemon: ${Thread.currentThread().isDaemon}")
// 死循环
while (true) {}
}, "aa")

t.setDaemon(true)

t.start()
logger.info(s"线程${Thread.currentThread().getName}结束")
【信息】 - 2021-11-08T20:52:17.538277300: 线程aa,daemon: true
【信息】 - 2021-11-08T20:52:17.538277300: 线程main结束

Process finished with exit code 0

   转载规则


《用户线程和守护线程》 Harbor Zeng 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
Synchronized关键字分析 Synchronized关键字分析
是关键字 是同步锁 不能被继承,子类中必须显式地加上 synchronized 关键字 修饰 锁类型 称为 作用范围 作用对象 代码块 对象锁 同步语句块 大括号{} 括起来的代码 调用这个代码块的对象 方法 对象锁 同步方法 整个方法 调用这个方法的对象 静态方法 全局锁 同步静态方法 整个静态方法 这个类的所有对象 类 全局锁 同步语句块 大括号{} 括起来的代码
2021-11-08
下一篇 
Zookeeper知识点 Zookeeper知识点
介绍 Zookeeper Zookeeper 是一个开源的分布式的,为分布式框架提供协调服务的 Apache 项目。 Zookeeper从设计模式角度来理解:是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper 就将负责通知已经在Zookeeper上注册的那些观察者做出相应的反应。 Zookeepe
2021-11-07
  目录