Java 入门 之 线程状态说明

来源:互联网 发布:淘宝子账号怎么登陆 编辑:程序博客网 时间:2024/06/03 22:58


线程状态从大的方面来说,可归结为:初始状态、可运行状态、不可运行状态和消亡状态,具体可细分为7个状态,说明如下:

1) 线程的实现有两种方式,一是继承 Thread 类,二是实现 Runnable 接口,但不管怎样,当我们 new 了 Thread 实例后,线程就进入了初始状态;

2) 当该对象调用了 start() 方法,就进入可运行状态;

3) 进入可运行状态后,当该对象被操作系统选中,获得 CPU 时间片就会进入运行状态;

4) 进入运行状态后 case 就比较多,大致有如下情形:

﹒run() 方法或 main() 方法结束后,线程就进入终止状态;

﹒当线程调用了自身的 sleep() 方法或其它线程的 join() 方法,就会进入阻塞状态(该状态既停止当前线程,但并不释放所占有的资源)。当 sleep() 结束或 join() 结束后,该线程进入可运行状态,继续等待OS分配时间片;

﹒当线程刚进入可运行状态(注意,还没运行),发现将要调用的资源被锁牢 (synchroniza,lock) ,将会立即进入锁池状态,等待获取锁标记(这时的锁池里也许已经有了其他线程在等待获取锁标记,这时它们处于队列状态,既先到先得),一旦线程获得锁标记后,就转入可运行状态,等待 OS 分配 CPU 时间片;

﹒当线程调用 wait() 方法后会进入等待队列(进入这个状态会释放所占有的所有资源,与阻塞状态不同),进入这个状态后,是不能自动唤醒的,必须依靠其他线程调用 notify() 或 notifyAll() 方法才能被唤醒(由于 notify() 只是唤醒一个线程,但我们由不能确定具体唤醒的是哪一个线程,也许我们需要唤醒的线程不能够被唤醒,因此在实际使用时,一般都用 notifyAll() 方法,唤醒有所线程),线程被唤醒后会进入锁池,等待获取锁标记。

﹒当线程调用 stop 方法,即可使线程进入消亡状态,但是由于 stop 方法是不安全的,不鼓励使用,大家可以通过 run 方法里的条件变通实现线程的 stop 。

java notify() 与 notifyAll() 的区别首先,使用wait方法和使用synchornized来分配 CPU 时间是有本质区别的。wait 会释放锁,synchornized 不释放锁。还有(wait / notify / notifyAll)只能在取得对象锁的时候才能调用。调用 notifyAll 通知所有线程继续执行,只能有一个线程在执行其余的线程在等待(因为在所有线程被唤醒的时候在 synchornized 块中)。这时的等待和调用notifyAll前的等待是不一样的。notifyAll前:在对象上休息区内休息。notifyAll后:在排队等待获得对象锁。notify 和 notifyAll都是把某个对象上休息区内的线程唤醒, notify 只能唤醒一个,但究竟是哪一个不能确定,而 notifyAll 则唤醒这个对象上的休息室中所有的线程。  一般有为了安全性,我们在绝对多数时候应该使用notifiAll(),除非你明确知道只唤醒其中的一个线程,至于有些书上说“notify 唤醒同一对象监视器中调用 wait 的第一个线程”是没有根据的,因为 SUN 公司是这样说的“The choice is arbitrary and occurs at the discretion of the implementation.”


0 0