学习Java多线程状态转换

Java多线程拥有五个状态:新建、就绪、运行、阻塞、结束。

  • 新建状态:就是创建线程对象,也就是new一个新的线程,未做其他任何动作,相当于初始化线程;
  • 就绪状态:如果线程当前状态为新建,那么执行线程的start()方法,就使得线程状态更新为就绪。注意线程的状态为就绪时,线程还未真的运行起来,只是在排队等待CPU时间片。如果线程当前状态为阻塞,那么线程在以下几种情况下会将状态更新为就绪:1)当前线程获得了同步锁;2)当前线程sleep时间结束;3)当前线程的阻塞IO完成;4)当前线程join方法执行结束;
  • 运行状态:当前线程获得了CPU的运行时间片,真真正正的在CPU中执行程序代码;
  • 阻塞状态:在以下几种情况下,线程状态会转换为阻塞状态:1)线程调用了wait方法;2)线程调用了sleep方法;3)线程调用了join方法;4)线程未获得同步锁;5)线程中只用了阻塞IO的情况;
  • 结束状态:通常为线程运行结束了或者线程运行中发生了异常;

大白话的说一下线程状态的转换:

当创建一个新的线程时,此时该线程的状态为新建(new);当该线程调用了start方法后,线程先进入就绪状态(此时不知道CPU是否在处理其他线程满负荷运转),如果此时CPU为空闲状态,那么该线程马上由就绪状态改为运行状态;运行状态中的线程,如果未受到其他线程的干扰,会顺利的执行完线程的程序代码;但是如果受到了其他线程的影响(例如,大量的线程发起,CPU会重新分配时间片),又或者线程需要在某一时刻暂停一会儿等情况,该线程就进入了阻塞状态;当线程进入阻塞状态后,如果是因为调用了wait方法,那么需要等待其他线程来唤醒;如果是调用了sleep/join方法,需等待方法结束后即可进入就绪状态.......直到这个线程执行完任务。

猜你喜欢

转载自my.oschina.net/OHC1U9jZt/blog/1808392