【Java 深入学习】线程状态
线程的状态有几种
Java 中的线程的生命周期大体可分为 6 种状态。
1.NEW-新建(新创建的线程对象就是 NEW,不是可运行状态 不会让 cpu 处理)
2.RUNNABLE-可运行(新创建的线程对象 start 后才会变成可运行状态,cpu 处理)
4.BLOCKED-阻塞(当线程争抢锁失败后变为阻塞状态,获取锁成功后又从阻塞状态变为可运行运行状态)
5.WAITING-等待(如果争抢锁成功 但是当前线程不满足某些条件 调用 wait 方法 暂时释放锁 当前线程进入 wait 状态,在条件满足时 由其他线程调用 notify 方法 唤醒等待线程 然后再去争抢锁 如果成功则进入可运行状态,如果不成功进入阻塞状态)
6.TIMED_WAITING-等待(有时限)(设置一个时间,如果等待的时间到了会自己唤醒 或者 在时间之内被 notify 唤醒),补充这种等待可以通过 sleep(time)进行转换 不需要和锁有关系,就是 sleep 后进入 TIMED_WAITING 状态 时间到了恢复,TERMINATED-终结(线程走到尽头,释放线程)
(一). 等待阻塞:运行(running)的线程执行 o.wait()方法,JVM 会把该线程放入等待队列(waitting queue)中。
(二). 同步阻塞:运行(running)的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则 JVM 会把该线程放入锁池(lock pool)中。
(三). 其他阻塞:运行(running)的线程执行 Thread.sleep(long ms)或 t.join()方法,或者发出了 I/O 请求时,JVM 会把该线程置为阻塞状态。当 sleep()状态超时、join()等待线程终止或者超时、或者 I/O 处理完毕时,线程重新转入可运行(runnable)状态。
线程和等待的关系
假如新建有多个线程并 start 后 进入可运行状态 但是有一个部分需要线程同步,此时多个线程争抢一把锁,假如线程 1 争抢成功,那么其它线程进入阻塞状态,线程 1 如果不满足某些条件则进入等待状态 释放锁,现在其它线程开始争抢锁,如果线程 2 争抢成功 那么除线程 1 线程 2 之外其它的线程陷入阻塞状态 线程 2 完成了线程 1 的某些条件 线程 2 完成自己的任务释放锁,现在除线程 1 之外的所有线程再来争抢这把锁,现在线程 3 争抢成功 并且完成了线程 1 所需要的所有条件 现在唤醒线程 1 线程 3 完成自己的任务释放锁,现在因为线程 1 被唤醒时线程 3 还没有释放锁 所以 线程 1 由等待状态变成了阻塞状态 然后线程 3 释放锁,所以现在 所有的线程(包括线程 1)开始争抢锁。
版权声明: 本文为 InfoQ 作者【Geek_65222d】的原创文章。
原文链接:【http://xie.infoq.cn/article/176beea37bf8285107cd11a1e】。未经作者许可,禁止转载。
评论