java线程到底有多少种状态?

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhangyufei1107/article/details/79741622

    之前一直没有弄明白线程到底有多少种状态,网上说几种的都有,没有一个权威的解释,今天在看tdump的时候,注意到了java.lang.Thread.State: RUNNABLE 这段内容,这里的State果断就是线程的状态啊!!!

    通过查看State源码,线程共有6种状态:

NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED

分别对应于

新建、运行、阻塞、等待、带超时的等待、终止


这里重点说等待和超时等待,

状态变为等待可以有以下几种方式:

1、Object里面的wait()方法//很常用

2、Thread.join()方法//很常用

3、LockSupper.park()// 重点


状态变为超时等待有以下几种方式:

1、Thread.sleep(long)方法//很常用

2、Object.wait(long)方法//跟wait()不一样

3、Thread.join(long)方法//跟Thread.join()不一样

4、LockSupper.parkNanos// 重点

5、LockSupper.parkUntil// 重点


LockSupper.parkxxx()的使用最经典的是JDK5并发包,

1、在lock的时候如果失败,使线程等待;

2、在Lock实例的newCondition()对象Condition.await()。——相似于Object的wait()但更为强大,可以在等待期间不响应中断


    无论是Object.wait()被Object.notify(),Thread.interrupt()还是Condition.await()被Conditon.signal(),Thread.interrupt()都会使被唤醒线程状态由WAITING、TIMED_WAITING 先转为BLOCKED,因为此时唤醒线程并没有释放锁。




展开阅读全文

没有更多推荐了,返回首页