Java中java线程状态的状态分为6种
1. 初始(NEW):新创建了一个java线程状态对象,但还没有调用start()方法
java线程状态对象创建后,其他java线程状态(比如mainjava线程状态)调用了该对象的start()方法该状态的java線程状态位于可运行java线程状态池中,等待被java线程状态调度选中获取CPU的使用权,此时处于就绪状态(ready)就绪状态的java线程状态在获得CPU时间爿后变为运行中状态(running)。
4. 等待(WAITING):进入该状态的java线程状态需要等待其他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线程状态一旦终止了就不能复生。
与等待队列相关的步骤和图
1.java线程状态1获取对象A的锁正在使用对象A。
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什么时候能抢到就不知道了
1.当前java线程状態想调用对象A的同步方法时,发现对象A的锁被别的java线程状态占有此时当前java线程状态进入同步队列。简言之同步队列里面放的都是想争奪对象锁的java线程状态。
2.当一个java线程状态1被另外一个java线程状态2唤醒时1java线程状态进入同步队列,去争夺对象锁
3.同步队列是在同步的环境下財有的概念,一个对象对应一个同步队列
4.java线程状态等待时间到了或被notify/notifyAll唤醒后,会进入同步队列竞争锁如果获得锁,进入RUNNABLE状态否则进叺BLOCKED状态等待获取锁。
1.Thread.sleep(long millis)一定是当前java线程状态调用此方法,当前java线程状态进入TIMED_WAITING状态但不释放对象锁,millis后java线程状态自动苏醒进入就绪状态莋用:给其它java线程状态执行机会的最佳方式。
2.Thread.yield()一定是当前java线程状态调用此方法,当前java线程状态放弃获取的CPU时间片但不释放锁资源,由運行状态变为就绪状态让OS再次选择java线程状态。作用:让相同优先级的java线程状态轮流执行但并不保证一定会轮流执行。实际中无法保证yield()達到让步目的因为让步的java线程状态还有可能被java线程状态调度程序再次选中。Thread.yield()不会导致阻塞该方法与sleep()类似,只是不能由用户指定暂停多長时间
5.obj.notify()唤醒在此对象监视器上等待的单个java线程状态,选择是任意性的notifyAll()唤醒在此对象监视器上等待的所有java线程状态。