Java中java 线程状态的状态分为6种
- 初始(NEW):新创建了一个java 线程状态对象,但还没有调用start()方法
- 运行(RUNNABLE):Javajava 线程状态中将就绪(ready)和运行中(running)两种状态笼统的称为“运行”。 java 线程状态對象创建后其他java 线程状态(比如mainjava 线程状态)调用了该对象的start()方法。该状态的java 线程状态位于可运行java 线程状态池中等待被java 线程状态调度选中,获取CPU的使用权此时处于就绪状态(ready)。就绪状态的java 线程状态在获得CPU时间片后变为运行中状态(running)
- 阻塞(BLOCKED):表示java 线程状态阻塞于锁。
- 等待(WAITING):进入该状态的java 线程状态需要等待其他java 线程状态做出一些特定动作(通知或中断)
- 超时等待(TIMED_WAITING):该状态不同于WAITING,它可以在指定的时间后洎行返回
- 终止(TERMINATED):表示该java 线程状态已经执行完毕。
这6种状态定义在Thread类的State枚举中可查看源码进行一一对应。
实现Runnable接口和继承Thread可以得到一个java 線程状态类new一个实例出来,java 线程状态就进入了初始状态
就绪状态只是说你资格运行,调度程序没有挑选到你你就永远是就绪状态。 調用java 线程状态的start()方法此java 线程状态进入就绪状态。 当前java 线程状态sleep()方法结束其他java 线程状态join()结束,等待用户输入完毕某个java 线程状态拿到对潒锁,这些java 线程状态也将进入就绪状态 当前java 线程状态时间片用完了,调用当前java 线程状态的yield()方法当前java 线程状态进入就绪状态。 锁池里的java 線程状态拿到对象锁后进入就绪状态。
java 线程状态调度程序从可运行池中选择一个java 线程状态作为当前java 线程状态时java 线程状态所处的状态这吔是java 线程状态进入运行状态的唯一一种方式。
阻塞状态是java 线程状态阻塞在进入synchronized关键字修饰的方法或代码块(获取锁)时的状态
处于这种状态嘚java 线程状态不会被分配CPU执行时间,它们要等待被显式地唤醒否则会处于无限期等待的状态。
处于这种状态的java 线程状态不会被分配CPU执行时間不过无须无限期等待被其他java 线程状态显示地唤醒,在达到一定时间后它们会自动唤醒
当java 线程状态的run()方法完成时,或者主java 线程状态的main()方法完成时我们就认为它终止了。这个java 线程状态对象也许是活的但是,它已经不是一个单独执行的java 线程状态java 线程状态一旦终止了,僦不能复生 在一个终止的java 线程状态上调用start()方法,会抛出java.lang.IllegalThreadStateException异常
1、java 线程状态1获取对象A的锁,正在使用对象A
2、java 线程状态1调用对象A的wait()方法。
3、java 线程状态1释放对象A的锁并马上进入等待队列。
4、锁池里面的对象争抢对象A的锁
5、java 线程状态5获得对象A的锁,进入synchronized块使用对象A。
6、java 线程状态5调用对象A的notifyAll()方法唤醒所有java 线程状态,所有java 线程状态进入同步队列若java 线程状态5调用对象A的notify()方法,则唤醒一个java 线程状态不知道会喚醒谁,被唤醒的那个java 线程状态进入同步队列
8、同步队列的java 线程状态争抢对象锁,但java 线程状态1什么时候能抢到就不知道了
- 当前java 线程状態想调用对象A的同步方法时,发现对象A的锁被别的java 线程状态占有此时当前java 线程状态进入同步队列。简言之同步队列里面放的都是想争奪对象锁的java 线程状态。
- 当一个java 线程状态1被另外一个java 线程状态2唤醒时1java 线程状态进入同步队列,去争夺对象锁
- 同步队列是在同步的环境下財有的概念,一个对象对应一个同步队列
- java 线程状态等待时间到了或被notify/notifyAll唤醒后,会进入同步队列竞争锁如果获得锁,进入RUNNABLE状态否则进叺BLOCKED状态等待获取锁。
1、Thread.sleep(long millis)一定是当前java 线程状态调用此方法,当前java 线程状态进入TIMEDWAITING状态但不释放对象锁,millis后java 线程状态自动苏醒进入就绪状态作用:给其它java 线程状态执行机会的最佳方式。
2、Thread.yield()一定是当前java 线程状态调用此方法,当前java 线程状态放弃获取的CPU时间片但不释放锁资源,由运行状态变为就绪状态让OS再次选择java 线程状态。作用:让相同优先级的java 线程状态轮流执行但并不保证一定会轮流执行。实际中无法保证yield()达到让步目的因为让步的java 线程状态还有可能被java 线程状态调度程序再次选中。Thread.yield()不会导致阻塞该方法与sleep()类似,只是不能由用户指定暂停多长时间
5、obj.notify()唤醒在此对象监视器上等待的单个java 线程状态,选择是任意性的notifyAll()唤醒在此对象监视器上等待的所有java 线程状态。
如果大家喜歡我的文章可以关注个人订阅号。欢迎随时留言、交流如果想加入微信群的话一起讨论的话,请加管理员简栈文化-小助手(lastpass4u)他会拉你们进群。