刚才在看CSDN的问答时。发现这个问题。

原问题的作者是在观察jstack的输出时提出的疑问。那么BLOCKED和WAITING有什么差别呢?

答复在JDK源代码中能够找到,例如以下是java.lang.Thread.State类的一部分凝视。

/**

* Thread state for a thread blocked waiting for a monitor lock.

* A thread in the blocked state is waiting for a monitor lock

* to enter a synchronized block/method or

* reenter a synchronized block/method after calling

* {@link Object#wait() Object.wait}.

*/

BLOCKED,

/**

* Thread state for a waiting thread.

* A thread is in the waiting state due to calling one of the

* following methods:

* {@link Object#wait() Object.wait} with no timeout

* {@link #join() Thread.join} with no timeout

* {@link LockSupport#park() LockSupport.park}

*

*

* A thread in the waiting state is waiting for another thread to

* perform a particular action.

*

* For example, a thread that has called Object.wait()

* on an object is waiting for another thread to call

Object.notify() or Object.notifyAll() on

* that object. A thread that has called Thread.join()

* is waiting for a specified thread to terminate.

*/

WAITING,

从中能够清晰的得到线程处于BLOCKED和WAITING状态的场景。

BLOCKED状态

线程处于BLOCKED状态的场景。

  • 当前线程在等待一个monitor lock,比方等待运行synchronized代码块或者使用synchronized标记的方法。

  • 在synchronized块中循环调用Object类型的wait方法,例如以下是例子

    synchronized(this)

    {

    while (flag)

    {

    obj.wait();

    }

    // some other code

    }

WAITING状态

线程处于WAITING状态的场景。

  • 调用Object对象的wait方法,但没有指定超时值。

  • 调用Thread对象的join方法,但没有指定超时值。

  • 调用LockSupport对象的park方法。

提到WAITING状态,顺便提一下TIMED_WAITING状态的场景。

TIMED_WAITING状态

线程处于TIMED_WAITING状态的场景。

  • 调用Thread.sleep方法。
  • 调用Object对象的wait方法,指定超时值。

  • 调用Thread对象的join方法,指定超时值。
  • 调用LockSupport对象的parkNanos方法。
  • 调用LockSupport对象的parkUntil方法。
欢迎訪问Jackie的家。http://jackieathome.sinaapp.com/,如需转载文章,请注明出处。

最新文章

  1. phalcon: router规则与解析,已经生成router的链接地址
  2. Metasploit渗透测试魔鬼训练营
  3. nginx---Beginner's Guide
  4. 打包mysql、tomcat、jdk为一个软件
  5. j2ee的十三种技术
  6. python 标准库 -- re
  7. PHP运算符知识点
  8. [转载]MySQL5.6 PERFORMANCE_SCHEMA 说明
  9. AJAX跨域问题解决方法(1)——禁止浏览器进行跨域限制
  10. centos搭建git服务
  11. 安装zabbix 遇到的一些问题
  12. Centos7 优盘U盘安装以及解决安装时引导错误
  13. forEach 如何提前终止 跳出运行
  14. PHP与.Net的区别(一)接口
  15. SpringBatch的流程简介
  16. npm介绍和使用
  17. Android AES加密报错处理:javax.crypto.IllegalBlockSizeException: error:1e00007b:Cipher functions:OPENSSL_internal:WRONG_FINAL_BLOCK_LENGTH
  18. tomcat源码阅读之BackupManager
  19. mysql 之审计 init-connect+binlog完成审计功能
  20. mysql出现Too many connections的解决...

热门文章

  1. python学习-- Django Ajax CSRF 认证
  2. [python][oldboy][函数篇][1]名称空间
  3. scp -v 查看具体的过程
  4. 欧拉路&&欧拉回路 概念及其练习
  5. activemq 简单聊天
  6. mongodb的安装和sql操作
  7. JavaScript简明教程之Node.js
  8. ubuntu php编译安装配置
  9. display的32种写法
  10. bzoj 2844 albus就是要第一个出场 异或和出现次数 线性基