java 的几种线程的几种状态

时间:2022-08-13 18:17:44

线程究竟有几种状态?

查阅很多资料,最合理的解释就是笼统分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通过自己的方式来表达线程的几种状态。