您的位置:首页 > 编程语言 > Java开发

java线程中状态的转换

2011-05-04 15:57 453 查看
java线程中状态的转换

一、线程状态

线程的状态转换时控制线程的基础。

线程的状态可分为:新、终止、可运行、运行、等待/阻塞。



1.新状态:线程对象已经创建,但还没有调用start()方法。



2.可运行状态:当线程调用start()方法后,线程首先进入可运行状态。在线程运行后一旦线程进入阻塞、等待或睡眠状态,

则又返回到可运行状态。



3.运行状态:线程调度程序从可运行池中选择一个线程作为当前线程时线程所处的状态。这也是线程进入运行状态的唯一一种方式。



4.等待/阻塞/睡眠状态:此时线程依旧是活的,但已经让出CPU,等待满足条件时,再次进入可运行状态。



5.死亡态:当线程的run()方法完成时就认为它死去。这个线程对象也许是活的,但是,它已经不是一个单独执行的线程。线程一旦死亡,就不能复生。

如果在一个死去的线程上调用start()方法,会抛出java.lang.IllegalThreadStateException异常。



二、阻止线程执行。

1.睡眠

Thread.sleep(long millis)和Thread.sleep(long millis, int nanos)静态方法强制当前正在执行的线程休眠(暂停执行),以“减慢线程”。

当线程睡眠时,它入睡在某个地方,在苏醒之前不会返回到可运行状态。当睡眠时间到期,则返回到可运行状态。



睡眠的实现:调用静态方法。

try {

Thread.sleep(123);

} catch (InterruptedException e) {

e.printStackTrace();

}



睡眠的位置:为了让其他线程有机会执行,可以将Thread.sleep()的调用放线程run()之内。这样才能保证该线程执行过程中会睡眠。



注意:

1、线程睡眠是帮助所有线程获得运行机会的最好方法。

2、线程睡眠到期自动苏醒,并返回到可运行状态,不是运行状态。sleep()中指定的时间是线程不会运行的最短时间。因此,sleep()方法不能保证该线程睡眠到期后就开始执行。

3、sleep()是静态方法,只能控制当前正在运行的线程。

2.等待



2.join()方法

Thread的非静态方法join()让一个线程B“加入”到另外一个线程A的尾部。在A执行完毕之前,B不能工作。

另外,join()方法还有带超时限制的重载版本。 例如t.join(5000);则让线程等待5000毫秒,如果超过这个时间,则停止等待,变为可运行状态。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: