对于不少Java学习者来说,线程有几种状态这个问题可能还不是很清楚,网上的各种博客的说法也是大相径庭。今天就来带大家一起揭开事实的真相,彻底搞明白线程到底有几种状态。
对于Java中线程究竟有几种状态这个问题,首先大家要学会在哪里找答案。由于在Java中,java.lang.Thread就是Java对线程的实现,所以很容易想到答案可能会在Thread类的注释中。
查看源码之后,果不其然,答案就在这里,请大家看下面的源码片段:
怎么样,是不是一目了然?答案就是6种。如果有点英语基础的朋友们就可以大概了解它们的意思了。
NEW:新的
RUNNABLE:可运行的
BLOCKED:阻塞的
WAITING:等待的
TIMED_WAITING:等待某个时间的
TERMINATED:终止的
接下来就让我们分别来看看它们各自的详细说明:
NEW
该状态描述的是线程已经被new出来,但还未启动。NEW这种状态对于每个线程来说,只可能有一次处于该状态,因为一个线程实例只能够被启动一次。
RUNNABLE
如果处于NEW状态的线程调用了start方法,就会处于RUNNABLE状态。但是请注意,线程有可能正在运行,也有可能在等待运行(具体什么时候运行要由线程调度器来安排)!
BLOCKED
当线程申请一个由其他线程持有的独占资源(比如锁)时就会处于该状态。当线程不再阻塞时,状态会从BLOCKED转为RUNNABLE。
WAITING
当一个线程执行了某些特定的方法后就会处于这种状态,也就是等待其他线程执行另外一些操作的状态。
能够使线程变为WAITING状态的几种方法是:Object.wait()、Thread.join()、LockSupport.park(Object blocker)。
TIMED_WAITING
该状态类似于上面的WAITING,只不过WAITING是无限制地等待,而TIMED_WAITING只等待一个特定的时间。时间一到,处于TIMED_WAITING状态的线程就会转为RUNNABLE。
TERMINATED
当线程执行完毕后会处于该状态。和NEW状态一样,每个线程实例也只可能有一次TERMINATED状态。不管是run方法正常结束还是由于抛出异常而提前终止,都会导致线程处于该种状态。
以上就是Java中线程有几种状态的介绍,希望大家都能够吸收掉这块的知识点,对于后续的Java并发编程是非常重要的。只有搞清楚线程的各个状态的特点,才能理清复杂的多线程编程。
如果本文对你有所帮助的话,欢迎转发关注,你的支持是我的最大帮助和动力。后续还会有更多原创文章分享给大家,敬请期待!
领取专属 10元无门槛券
私享最新 技术干货