[Interview系列 知识储备回顾] 线程篇[0]

简介

面试常问的进程, 线程, 协程之间的区别

进程是操作系统资源分配的基本单位, 线程是进程内部调度/分配的执行单元.
笔者并没有实际使用过协程, 像是golang语言也只是了解层面.
在个人的角度理解, 协程是提交于线程中需要执行的任务集, 其执行交由程序控制, 而不是内核去调度, 期间不需要考虑内核与用户态之间的切换, 减少了开销.
ps: 面试回答切忌不可多言, 免得把自己带坑.

如果需要具体点, 可以在线程与进程的区别深入, 像是这么阐述, 线程是进程的执行单元, 每一个线程都由自己的局部变量表, 程序计数器(指向正在执行的指令指针)以及各自的生命周期.
当然如果你对jvm不够熟悉的话, 不建议这样具体说明, 免得面试官指派下一个话题到jvm模型.

生命周期

面试的话题是需要引导的, 当然对于线程的生命周期是必要的.
对于线程生命周期了解的最好途径, 就是看Thread的API.
在源码中, 我们可以了解到enum State这个枚举
State枚举JavaDoc

  1. NEW
    处于当前状态的线程还未开始运行.
  2. RUNNABLE
    处于当前状态的线程正在被jvm执行
  3. BLOCKED
    处于当前状态的线程正在阻塞等待监视锁
  4. WAITING
    处于当前状态的线程正在无限期地等待另一个线程去执行某个特殊的动作
  5. TIMED_WAITING
    处于当前状态的线程正在等待另一个线程去执行某个特殊的动作, 当然是等待指定的时间内.
  6. TERMINATED
    处于当前状态的线程已经退出.
    透过源码枚举提供的信息, 我们可以清晰了解到线程的生命周期分为上述的6种状态.
    ps: 现在网传的太多文章, 都喜欢造词, 一些不明意义的专业术语, 个人对此是非常嗤之以鼻的. 哈哈, 虽然我现在也经常犯, 双标没跑了.

生命周期状态的转换, 是需要特定条件的. 网上也有很多流程图, 我这里直接拿javaDoc来讲解.

生命周期转换

  1. RUNNABLE
    可运行线程的线程状态, 处于该阶段状态的线程正在被jvm执行, 但是可能正在等待操作系统(处理器)分配资源给它.
  2. BLOCKED
    处于当前阶段状态的线程正在阻塞等待一个监视锁.
    场景描述:
    一个线程在执行synchronized修饰的方法或者代码块时尝试获取monitor未成功时,
    或者是显式调用Object#wait方法, 等待重返到synchronized修饰的方法或者代码块中.
  3. WAITING
    Object#wait 不指定等待时间
    Thread#join 不指定等待时间
    LockSupport#park
    执行以上api, 会使得线程处于waiting状态.
  • 一个线程进入waiting状态, 需要等待另一个线程去执行特殊的操作, 像是一个线程调用了Object#wait方法之后, 另一个线程持有同一个monitor锁进行Object#notify或者#notifyAll方法, 去唤醒处于等待状态的线程.
  • 或者是调用了Thread#join方法, 需要等待该Thread执行结束并退出.
  • LockSupport#park需要另一个线程显式指定LockSupport#unpark(需要唤醒的线程)
  1. TIME_WAITING
    同上, 看对应的api即可

Thread 创建方式

其实关于Thread的创建方式都已经是耳熟能详了, 这里单独拎出一个标题, 是主要解释下一些网传舆论.

  1. 继承Thread类
  2. 实现Runnable接口
  3. 实现Callable接口, 配合线程池ExecutorService#execute or #submit

这里声明一点, 以上均是线程执行实现, 而不是创建实现!
真正地创建线程的方式, 只有new Thread() 并执行start方法, 才会交由jvm去创建线程.
run方法不会去创建线程, 而是由当前线程(像是main)去执行.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值