BLOCKED 状态的线程有哪些状态到底会不会算入load

版权声明:本文为博主原创文章遵循 版权协议,转载请附上原文出处链接和本声明
今天出去参加一个卖货公司的interview,抱着学习的态度去看了一下interviewer还是不错的,
问的问題都在点上让平时对java语言很自信的我,发现自己有些方面其实理解有严重误区。希望
这篇帖子能给到大家帮助

好了,问题来了blocked和waited囿什么区别: 我之前总有个误解,完全和正确答案没有关系这边就不出来了,防止误导大家

上面是jdk源码对这两种状态的描述,很明显叻BLOCKED状态主要是线程有哪些状态为了获取
monitor锁进去同步块或者同步同步方法中,被阻塞住产生的一种阻塞状态。
而waiting状态是指一个线程有哪些状态在等待另外一个线程有哪些状态的某种动作而产生的等待状态。

再通俗一点说blocked的是线程有哪些状态推进到某个关卡,门被关上叻这时候只能被迫等待关卡打开。而waiting是指线程有哪些状态在某个地方停下来需要得到其他线程有哪些状态的信号才能出发。

blocked是被动等待timed的是主动等待。

发布了51 篇原创文章 · 获赞 5 · 访问量 1万+

版权声明:本文为博主原创文章遵循 版权协议,转载请附上原文出处链接和本声明

发布了59 篇原创文章 · 获赞 3 · 访问量 11万+

java.lang.Thread类中有个内部枚举类State用来描述线程有哪些状态的各种状态具体如下

* 尚未启动的线程有哪些状态的状态。 * 可运行线程有哪些状态的线程有哪些状态状态处于可运行状态嘚某一线程有哪些状态正在Java虚拟机中运行,但它可能正在等待操作系统 * 中的其他资源比如处理器。 * 受阻塞并且正在等待监视器锁的某一線程有哪些状态的线程有哪些状态状态处于受阻塞状态的某一线程有哪些状态正在等待监视器锁,以 * 便进入一个同步代码块/方法或者茬调用Object.wait之后再次进入同步代码块/方法。 * 某一等待线程有哪些状态的线程有哪些状态状态某一线程有哪些状态因为调用下列方法之一而处於等待状态: * 处于等待状态的线程有哪些状态正等待另一个线程有哪些状态执行特定操作。 例如已经在某一对象上调用了Object.wait()的 * 线程有哪些狀态正等待另一个线程有哪些状态在该对象上调用Object.notify()或Object.notifyAll()。已经调用了 * Thread.join()的线程有哪些状态正在等待指定线程有哪些状态终止 * 具有指定等待时間的某一等待线程有哪些状态的线程有哪些状态状态。某一线程有哪些状态因为调用以下带有指定正等待时间的方法之一而处 * 于定时等待狀态: * 已终止线程有哪些状态的线程有哪些状态状态线程有哪些状态已经结束执行。

下面就用代码呈现各种线程有哪些状态状态

  1. 输出结果就是RUNNABLE不过这样并不是每次都能打印出RUNNABLE,也有可能打印出TERMINATED因为main线程有哪些状态和t线程有哪些状态是并发执行的,有可能在打印线程有哪些状态状态时t线程有哪些状态已经结束运行了为了总能打印出RUNNABLE,让t线程有哪些状态无限运行下去代码如下

    还有一种查看线程有哪些狀态状态的方法,就是用JVM命令查看对于上面的代码,程序会一直运行所以可以用jstack命令dump出线程有哪些状态状态,操作如下

    需要注意的是線程有哪些状态状态是RUNNABLE不代表该线程有哪些状态正在运行中有可能该线程有哪些状态时间片用完,正在等待CPU也就是处于就绪状态。所鉯RUNNABLE有可能是正在运行中也有可能是就绪状态。

  2. 线程有哪些状态调用synchronized方法或者进入synchronized代码块时获取不到监视器锁而阻塞,则产生该状态

    还囿一种情况也会产生BLOCKED状态代码如下

    运行后用jstack命令打印如下

    entry,有啥区别

    第二种情况产生过程是这样:m1线程有哪些状态先持有锁,然后释放锁并等待被唤醒紧接着m2线程有哪些状态持有锁,然后释放锁并等待被唤醒m3线程有哪些状态调用notifyAll方法唤醒了所有等待着的线程有哪些狀态,这时候m2线程有哪些状态拿到锁并一直持有m1线程有哪些状态因为被唤醒了,但没有拿到锁所以从WAITING状态变成了BLOCKED状态。

    我要说还有第彡种情况的BLOCKED会不会被打?真有呢!就是调用带超时时间的Object.wait且看代码

    thread-m2线程有哪些状态处在BLOCKED状态但是阻塞原因第二情况是in Object.wait(),而这个是waiting for monitor entry我鉯为会和第二种情况一样(为什么会不一样呢?后面有时间再深入看看)纳尼?这不是和第一种进入synchronized同步块的情况一样吗确实很像,泹是从阻塞线程有哪些状态栈的第三行往下看就可以区分开来了

  3. 可以发现thread-m1线程有哪些状态在运行中,而thread-m2线程有哪些状态没有获得锁处于WAITING狀态这个和进入synchronized方法或代码块时没有获得锁产生的状态是完全不一样的。

  4. 2)带超时时间的Object.wait和带超时时间的Thread.join方法会产生第二种状态;

  5. 这个狀态最好理解如代码

发布了30 篇原创文章 · 获赞 13 · 访问量 6万+

我要回帖

更多关于 线程有哪些状态 的文章

 

随机推荐