之前一直没有弄明白线程到底有多少种状态,网上说几种的都有,没有一个权威的解释,今天在看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,因为此时唤醒线程并没有释放锁。