线程究竟有几种状态?
查阅很多资料,最合理的解释就是笼统分5种状态。
分别是:创建---就绪----运行—阻塞—销毁
在java中一个线程通过new创建线程实体,这样我们的线程就处于一个创建状态了。
然后我们通过调用start()启动线程,在线程启动的时候。这样线程就进入了就绪状态。
在就绪的时候,因为jvm会自动调用run方法。这样就进入了运行态。但是大家都知道就绪态到运行态在计算机操作系统里面说,只要就绪线程获得cpu资源就可变为运行态,这也说明了,虽然jvm自动调用了run会让他运行,但是如果cpu时间片(cpu资源)没有了。那么他还会回到就绪态,这里我们可以手动调用yield()实现。所以就绪态和运行态是双向的箭头。如果在运行态如果我们调用了sleep(),wait(),jion()方法,线程会进入阻塞态。如果让阻塞线程再次运行,只有将线程唤醒变为就绪态,然后在运行。如果一个线程正常运行完那么他就结束了,就是结束态。
下面我们看看一个线程类的一些方法。
1. start
()
使该线程开始执行;Java 虚拟机调用该线程的run
方法。
所以有个面试题经常问启动线程是start还是run,答案就是start
2. yield
()
暂停当前正在执行的线程对象,并执行其他线程。用这个方法可以让线程从运行态到就绪态。
3.
sleep
()
,sleep(long millis),sleep(long millis, int nanos)
在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。后面那个在加个纳秒。
4. join
()
,join
(long millis)
,join(long millis, int nanos)
等待该线程终止。
5.
wait
(
)
,
wait
(
long millis)
wait
(
long millis,int nanos)
让线程等待
3-5
这几个方法很奇怪都有重载形式,这3个方法可以让运行的线程进入到阻塞态。
6.notify
()和notifyAll()唤醒线程。
以上这些就是java通过自己的方式来表达线程的几种状态。