前言
大家好,我是十一郎。一个总在搜罗面经的程序员。
最近跟人群里进行技术交流,有人在面试中被Java的线程绊倒了,二面就终止了,这已经是ta第三回碰到了,都没有好好啃一下这个技术点,无缘offer太可惜了。我们一起来看下,这到底是是个什么不得了的问题,你碰到了能解决么?
问题:
Java的线程级别和生命周期究竟是怎么样的?从线程级别到生命周期进行分析讲解一下。
正文
Java线程属于内核级线程
由于JDK1.2——基于操作系统原生线程模型来实现。Sun JDK,它的Windows版本和Linux版本 都使用一对一的线程模型实现,一条Java线程就映射到一条轻量级进程之中。
-
内核级线程(Kernel Level Thread ,KLT):它们是依赖于内核的,即无论是用户进程中的线 程,还是系统进程中的线程,它们的创建、撤消、切换都由内核实现。
-
用户级线程(User Level Thread,ULT):操作系统内核不知道应用线程的存在。
问题
Java中是否存在协程?
答案:
Java中协程框架:kilim quasar
协程
协程,英文Coroutines, 是一种基于线程之上,但又比线程更加轻量级的存在,协程不是被操作 系统内核所管理,而完全是由程序所控制(也就是在用户态执行),具有对内核来说不可见的特性。
这样带来的好处就是性能得到了很大的提升,不会像线程切换那样消耗资源。
子程序,或者称为函数,在所有语言中都是层级调用,比如A调用B,B在执行过程中又调用 了C,C执行完毕返回,B执行完毕返回,最后是A执行完毕。而协程的调用和子程序不同。协程 在子程序内部是可中断的,然后转而执行别的子程序,在适当的时候再返回来接着执行。
假设由协程执行,在执行A的过程中,可以随时中断,去执行B,B也可能在执行过程中中断 再去执行A,结果可能是:1 2 x y 3 z。
协程的特点在于是一个线程执行,那和多线程比,协程有何优势?
线程的切换由操作系统调度,协程由用户自己进行调度,因此减少了上下文切换,提高了效率。线程的默认stack大小是1M,而协程更轻量,接近1k。因此可以在相同的内存中开启 更多的协程。不需要多线程的锁机制:因为只有一个线程,也不存在同时写变量冲突,在协程中控 制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多。
注意:协程适用于被阻塞的,且需要大量并发的场景(网络io)。不适合大量计算的场景。
Java线程的调度机制
线程调度是指系统为线程分配处理器使用权的过程,主要调度方式分两种,分别是协同式线程调 度和抢占式线程调度 协同式线程调度线程执行时间由线程本身来控制,线程把自己的工作执行完之后,要主动通知系统切换到另 外一个线程上。
最大好处是实现简单,且切换操作对线程自己是可知的,没啥线程同步问题。坏 处是线程执行时间不可控制,如果一个线程有问题,可能一直阻塞在那里。
抢占式线程调度
每个线程将由系统来分配执行时间,线程的切换不由线程本身来决定
Java中, Thread.yield()可以让出执行时间,但无法获取执行时间)。线程执行时间系统可控,也不会有 一个线程导致整个进程阻塞。
Java线程调度就是抢占式调度
希望系统能给某些线程多分配一些时间,给一些线程少分配一些时间,可以通过设置线程优 先级来完成。Java语言一共10个级别的线程优先级(Thread.MIN_PRIORITY至 Thread.MAX_PRIORITY),在两线程同时处于ready状态时,优先级越高的线程越容易被系统 选择执行。但优先级并不是很靠谱,因为Java线程是通过映射到系统的原生线程上来实现的,所 以线程调度最终还是取决于操作系统
接下来我们再来看看Java线程的生命周期
Java线程的生命周期
Java 语言中线程共有六种状态,分别是:
1. NEW(初始化状态)
2. RUNNABLE(可运行状态+运行状态)
3. BLOCKED(阻塞状态)
4. WAITING(无时限等待)
5. TIMED_WAITING(有时限等待)
6. TERMINATED(终止状态)
在操作系统层面,Java 线程中的 BLOCKED、WAITING、TIMED_WAITING 是一种状态, 即前面我们提到的休眠状态。也就是说只要 Java 线程处于这三种状态之一,那么这个线程就永 远没有 CPU 的使用权。
从JavaThread的角度,JVM定义了一些针对Java Thread对象的状态(jvm.h)
从OSThread的角度,JVM还定义了一些线程状态给外部使用,比如用jstack输出的线程堆栈信息中线程的状态(osThread.hpp)
怎么样,看完之后有没有绝对脑子瞬间清晰了,Java线程也没那么难嘛,以后面试中再遇到这样的问题,就可以跟面试官好好battle了~
对此,如果你有需要补充的,也欢迎在评论区留言~
(十一郎有话说:胖友们老规矩,不管现在用不用得到「收藏」先安排起来哟,再关注一下我,送你面经的那种好吗?直接扫下面名片加,送你一套硬核面经)