Java 线程状态

来源:互联网 发布:威迅java培训 编辑:程序博客网 时间:2024/06/05 15:46

线程状态:
    一个线程可处于以下四种状态之一:
      1. 新建(new):当线程被创建时,它只会短暂的处于这种状态。此时它已经分配了必需的系统资源,并执行了初始化。此刻线程已经有资格获得CPU 时间了,之后调度器会把这个线程转变为运行状态或阻塞状态。
      2. 就绪(Runnable):在这种状态下,只要调度器把时间片分配给线程,线程就可以执行。也就是说,在任意时刻,线程可以运行也可以不运行。只要调度器能分配时间片给线程,它就可以运行,这不同于死亡和阻塞状态。
      3. 阻塞(Blocked):线程能够运行,但有某个条件阻止它运行。当线程处于阻塞状态时,调度器会忽略此线程,不会分配给线程任何CPU 时间。直到线程重新进入了就绪状态,它才可能执行操作。
      4. 死亡 (Dead):处于死亡或者终止状态的线程将不再是可调度的,并且再也不会得到CPU 时间,它的任务已经结束,或者不再是可运行的。线程死亡的通常方式是从run() 方法返回,但是线程任务还可以被中断。

阻塞状态:
    一个任务进入租的状态可能有以下几种原因:
      1. 通过调用sleep(time) 使任务就如休眠状态,在这种状态下,任务在指定的时间内不会运行。
      2. 通过调用await() 使线程挂起。直到线程得到了notify() 或notifyAll() 消息(在Java SE5 的java.util.concurrent 类库中等价的signal() 或signalAll() 消息),线程就会进入就绪状态。
      3. 在任务中等待某个输入/输出完成。
      4. 任务试图在某个对象上调用其它同步控制方法,但是对象锁不可用,因为另一个任务已经获得了这个锁。
      在比较早的代码中可能还会看到suspend() 和resume() 来阻塞和唤醒线程,随着Java 版本的更新,这些方法已经被废弃了(因为这可能导致死锁),stop() 方法也已经被废弃了,因为它不会释放线程的锁。

线程中断:来源处理 InterruptedException,作者:Brian Goetz ,感谢!
      每个线程都有一个与之相关联的 Boolean 属性,用于表示线程的中断状态(interrupted status)。中断状态初始时为 false;当另一个线程通过调用 Thread.interrupt() 中断一个线程时,会出现以下两种情况之一。如果那个线程在执行一个低级可中断阻塞方法,例如 Thread.sleep()、 Thread.join() 或 Object.wait(),那么它将取消阻塞并抛出 InterruptedException。否则, interrupt() 只是设置线程的中断状态。 在被中断线程中运行的代码以后可以轮询中断状态,看看它是否被请求停止正在做的事情。中断状态可以通过 Thread.isInterrupted() 来读取,并且可以通过一个名为 Thread.interrupted() 的操作读取和清除。
      中断是一种协作机制。当一个线程中断另一个线程时,被中断的线程不一定要立即停止正在做的事情。相反,中断是礼貌地请求另一个线程在它愿意并且方便的时候停止它正在做的事情。有些方法,例如 Thread.sleep(),很认真地对待这样的请求,但每个方法不是一定要对中断作出响应。对于中断请求,不阻塞但是仍然要花较长时间执行的方法可以轮询中断状态,并在被中断的时候提前返回。 您可以随意忽略中断请求,但是这样做的话会影响响应。
      中断的协作特性所带来的一个好处是,它为安全地构造可取消活动提供更大的灵活性。我们很少希望一个活动立即停止;如果活动在正在进行更新的时候被取消,那么程序数据结构可能处于不一致状态。中断允许一个可取消活动来清理正在进行的工作,恢复不变量,通知其他活动它要被取消,然后才终止。

                                                                                                            参考书籍:
                                                                                                                《Java 编程思想》Bruce Eckel 著 陈昊鹏 译

原创粉丝点击