JAVA线程状态

来源:互联网 发布:thinkphp3.2 商城源码 编辑:程序博客网 时间:2024/06/05 10:20

java线程定义了6种状态,这些状态定义在Thread类的内部枚举类,分别定义了6种状态如下:

线程的状态

  • NEW 至今尚未启动的线程处于这种状态。
  • RUNNABLE 正在 Java 虚拟机中执行的线程处于这种状态。

    可运行线程的线程状态。处于可运行状态的某一线程正在 Java 虚拟机中运行,但它可能正在等待操作系统中的其他资源,比如处理器。

  • BLOCKED 受阻塞并等待某个监视器锁的线程处于这种状态。

    受阻塞并且正在等待监视器锁的某一线程的线程状态。处于受阻塞状态的某一线程正在等待监视器锁,以便进入一个同步的块/方法,或者在调用Object.wait 之后再次进入同步的块/方法。

  • WAITING 无限期地等待另一个线程来执行某一特定操作的线程处于这种状态。

    某一等待线程的线程状态。某一线程因为调用下列方法之一而处于等待状态:
    不带超时值的 Object.wait
    不带超时值的 Thread.join
    LockSupport.park
    处于等待状态的线程正等待另一个线程,以执行特定操作。 例如,已经在某一对象上调用了 Object.wait() 的线程正等待另一个线程,以便在该对象上调用 Object.notify() 或 Object.notifyAll()。已经调用了 Thread.join() 的线程正在等待指定线程终止。

  • TIMED_WAITING 具有指定等待时间的某一等待线程的线程状态,相对于WAITING,添加了等待的时间。

    某一线程因为调用以下带有指定正等待时间的方法之一而处于定时等待状态:
    Thread.sleep
    带有超时值的 Object.wait
    带有超时值的 Thread.join
    LockSupport.parkNanos
    LockSupport.parkUntil

  • TERMINATED 已退出的线程处于这种状态。线程已经结束执行。

BLOCKED和WAITING/TIMED_WAITING的区别

知乎上面有很形象的答案
作者:赵老师
链接:https://www.zhihu.com/question/27654579/answer/128050125
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

假设t1,t2先后两个线程,都执行如下代码:
synchronized(Obj) {
Obj.wait();
}

t1先进,最后在Obj.wait()下卡住,这时java管t1的状态waitting状态t2后进,直接在第一行就卡住了,这时java叫t2为blocked状态。请注意,blocked是过去分词,意味着他是被卡住的(无辜啊,全是泪)。因为这段代码只让一条线程运行。同时,jvm是知道怎么结束blocked的,只要别的线程退出这段代码,他就会自动让你进去。也就是说别的线程无需唤醒你,由jvm自动来干。而waiiting是说我调用wait()等函数,主动卡住自己(我在等一个白富美),请jvm在满足某种条件后(白富美发消息让我们晚上见),比如另条线程调用了notify()后,把我唤醒。这个唤醒的责任在于别的线程(白富美)明确的调用一些唤醒函数。做这样的区分,是jvm出于管理的需要,做了这种区分,比如两个原因的线程放两个队列里管理,如果别的线程运行出了synchronized这段代码,我只需要去blocked队列,放个出来。而某人调用了notify(),我只需要去waitting队列里取个出来。P.S.
从linux内核来看,这些线程都是等待状态,没区别,区别只在于java的管理需要。通常我们在系统级别说线程的blocked,是说线程操作io,被暂停了,这种线程由linux内核来唤醒(io设备报告数据来了,内核把block的线程放进可运行的进程队列,依次得到处理器时间),而wait是说,等待一个内核mutex对象,另个线程signal这个mutex后,这个线程才可以运行。区别在于由谁唤醒,是操作系统,还是另一个线程,这里倒和java很相似。

总结起来就是:

Blocked是在等待线程获取锁,是被动的阻塞;waiting或者timed_waiting是在等待其它线程发来通知(调用Thread类的notify()/notifyAll()方法),收到通知后就可能进入runnable状态或者进入重新获取锁的竞争,如果竞争失败进入Blocked状态

1 0
原创粉丝点击