梦想飞翔

自强不息
posts - 111, comments - 30, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

线程状态

Posted on 2009-02-25 11:09 love1563 阅读(1700) 评论(0)  编辑  收藏 所属分类: Java语言*高级版
1 线程状态
      线程可以有一下4个状态:
        · New (新生)
        ·Runnable(可运行)
        ·Blocked(被阻塞)
        · Dead(死亡)
1.1 新生线程
    当你new操作符创建一个线程时,new thread(r),线程还没开始运行,此时线程处在新生(new)状态。当一个线程出于新生状态时,程序还没有开始运行线程中的代码。在程序开始运行之前还又一些簿记工作要做。
1.2 可运行的线程
     一旦调用了start方法,该线程就成为可运行的(Runnable)了。一个可运行线程可能实际上正在运行,也可能没有,这取决于操作系统为该线程提供的运行时间。
    一旦线程开始运行,它不需要始终保持运行。事实上,线程在运行过程中有时需要被中断,目的是使其他线程获得运行的机会,线程调度的细节取决于操作系统所提供的服务。如:抢占式调度的系统给每个可运行的线程一个时间片来处理任务。当这个时间片用完时,操作系统剥夺该线程对资源的占用,使其他线程有机会运行。在选择下一个线程时,操作系统会考虑线程的优先级。
    所有现在的桌面和服务器操作系统都使用抢占式调度。但一些小型设备,如:手机,可能采用协作式调度。在这样的设备中,一个线程只有在调度sleep或者yield这样的方法时才会丢失控制权。

    一个多处理器的机器上,每个处理器都可以运行一个线程,你可以使多个线程并行运行。当然如果线程的个数大于处理器的个数,那么调度器将仍旧采用时间片机制。
    在任何给定的时刻,一个可运行线程可能正在运行,也可能不是。(这正式为什么把这个状态成为runnable,而不是running)。

1.3 被阻塞线程
     当发生一下任何一种情况时,线程就进入被阻塞状态:

    ·线程通过调用sleep方法进入睡眠状态;
    ·线程调用一个在I/O上被阻塞的操作,即该操作在输入输出操作完成之前不会返回到它的调用者;
    ·线程试图得到一个锁,而该锁正被其他线程持有。
    ·线程正等待某个触发条件;


     如上图显示,线程的各种装填及状态之间的转化关系。当一个线程被阻塞(或者,当它死亡时),另一个线程就可以被调度欲行了。当一个被阻塞的线程重新被激活时(例如,由于它的睡眠时间已经到达了制定的毫秒数或者因为它等待I/O已经完成),调度器检查它的优先级是否高于当前的运行线程,如果是,它就将抢占当前线程的资源并开始运行。

        通过一下几种途径中的一种,线程可以从被阻塞状态到可运行状态。
        1)线程被置于睡眠状态,且已经经过指定的毫秒数。
        2)线程正在等待I/O操作的完成,且该操作已经完成。
        3)线程正在等待另一个线程所持有的锁,且另一个线程已经释放该锁的所有权;(也有可能等待超时。当超时发生时,线程解除阻塞。)
        4)线程正在等待某个触发条件,且另一个线程发出了信号表明条件已经发生了变化。(如果为线程的等待设置了一个超时,那么当超时发生时该线程将解除阻塞。)
        5)线程已经被挂起,且有人调用了它的resume方法。不过,由于suspend方法已经过时,resume方法也就随之被弃用了,你不应该在自己的代码里调用它。

        一个被阻塞的线程只能通过和先前阻塞它的相同的过程重新进入可运行状态。要特别注意,你不能通过调用resume方法来解除被阻塞线程的阻塞状态。

只有注册用户登录后才能发表评论。


网站导航: