java线程状态

1、线程的状态:
•   新建状态:当new一个线程后,该线程处于新建状态,此时它和Java对象一样,仅仅由Java虚拟机为其分配内存空间,并初始化成员变量。此时线程对象没有表现出任何的动态特征,程序也不会执行线程的执行体.
就绪状态(Runnable):线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu 的使用权 。
运行状态(Running):可运行状态(runnable)的线程获得了cpu 时间片(timeslice) ,执行程序代码。
阻塞状态
当发生下列事件时,处于运行状态的线程会转入到阻塞状态:
a.  调用了sleep()方法;
b.  线程调用wait()方法等待特定条件的满足——等待阻塞;
c.  线程调用了阻塞式IO方法,在该方法返回前,该线程被阻塞;
d. 线程试图获得一个同步监视器(锁),但该同步监视器正被其他线程所持有——同步阻塞。

返回就绪状态(Runnable):
a.  处于睡眠状态的线程在指定的时间过去后;
b.  如果线程在等待某一条件,另一个对象必须通过notify()或notifyAll()方法通知等待线程条件的改变;
c.  线程调用的阻塞IO已经返回,阻塞方法执行完毕;
d.  线程成功获得了试图同步的监视器。

消亡状态:当线程的run()方法执行结束、或者抛出异常,该线程自然消亡。死亡的线程不可再复生。


2、状态图:



3、Thread.sleep()方法:
• 由于sleep()方法是Thread类的方法,因此它不能改变对象的机锁。所以当在一个Synchronized方法中调用sleep()时,线程虽然休眠了,但是对象的机锁没有被释放,其他线程仍然无法访问这个对象。
• 当调用sleep方法后线程进入阻塞状态,在sleep时间段内,该线程不会获得执行机会,即使没有其他可运行的线程,处于sleep的线程不会执行;时间过了以后线程变为就绪态;
• sleep()方法不需要在同步的代码块中执行。

4、Thread.yield()方法:
• 和sleep有点类似,它也可以让当前执行的线程暂停,但它不会阻塞线程,只是将该线程转入到就绪状态。因此完全有可能调用yield方法暂停之后,立即再次获得处理器资源继续运行。
• sleep声明抛出了InterruptedException异常,所以调用sleep方法时,要么捕获异常,要么抛出异常。而yield没有申明抛出任何异常。
• sleep方法暂停当前线程后,会给其他线程执行集合,不会理会线程的优先级。但yield则会给优先级相同或高优先级的线程执行机会。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赶路人儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值