线程状态

Posted aaroncnblogs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程状态相关的知识,希望对你有一定的参考价值。

NEW

线程刚刚创建。

Thread t = new Thread();

 

RUNNABLE

已进入临界区(获得锁),正在执行或等待CPU/IO等资源。

t.start();

 

BLOCKED

未进入临界区,等待锁。

final Object lock = new Object();

Runnable run = new Runnable() {

    public void run() {

        synchronized (lock) {

            …

        }

    }

}

Thread t1 = new Thread(run);

t1.setName( “t1”);

Thread t2 = new Thread(run);

t2.setName( “t2”);

t1.start();

t2.start();

 

WAITING:

已进入临界区(获得锁),调用了wait,需要其他线程调用notify / notifyAll唤醒;或join了另外线程等待其结束。

final Object lock = new Object();

Thread t1 = new Thread(){

    public void run() {

        synchronized (lock) {

            lock.wait();  // 消费者

        }

    }

}.start();

Thread t2 = new Thread(){

    public void run() {

        synchronized (lock) {

            lock.notifyAll();  // 生产者

        }

    }

}.start();

 

TIMED_WAITING:

有时间限制的WAITING,在调用wait(long), join(long)等情况下,或sleep

synchronized (lock) {

    lock.wait(60 * 1000L);

}

synchronized (lock) {

    sleep(30*1000L);

}

 

TERMINATED:

run方法已执行完毕。

 

通过jstack查看线程状态;

标题为threadName priority tid nid desc

跟踪 tid, nid 都可以唯一找到线程

如果BLOCK说明synchronized块中处理速度比较慢;

如果WAITING说明性能瓶颈存在于触发notify的那段逻辑

以上是关于线程状态的主要内容,如果未能解决你的问题,请参考以下文章

线程的状态

线程的状态

Java多线程之线程的状态以及线程间协作通信导致的状态变换

Java多线程:线程状态

多线程状态及线程池管理

Java线程 — 线程的通信 — 线程的生命周期和状态概述