A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李长波 中级黑马   /  2012-11-10 17:04  /  1778 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

线程的阻塞模式好,还是非阻塞模式好呢!线程阻塞的处理机制!

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 神马都是浮云

查看全部评分

1 个回复

正序浏览

         如果处于就绪状态的线程就获得了CPU,开始执行run方法的线程执行体,则该线程处于运行状态。

         单CPU的机器,任何时刻只有一条线程处于运行状态。当然,在多CPU机器上将会有多线程并行(parallel)执行,

    当线程大于CPU数量时,依然会在同一个CPU上切换执行。

    线程运行机制:一个线程运行后,它不可能一直处于运行状态(除非它执行的时间很短,瞬间执行完成),线程在运行过程中需要中断,

    目的是让其他的线程有运行机会,线程的调度取决于底层的策略。对应抢占式的系统而言,系统会给每个可执行的线程一个小时间段来处理任务,

    当时间段到达系统就会剥夺该线程的资源,让其他的线程有运行的机会。在选择下一个线程时,系统会考虑线程优先级。

    以下情况会出现线程阻塞状态:

        A、线程调用sleep方法,主动放弃占用的处理器资源

        B、线程调用了阻塞式IO方法,在该方法返回前,该线程被阻塞

        C、线程试图获得一个同步监视器,但该同步监视器正被其他线程所持有。

        D、线程等待某个通知(notify)

        E、程序调用了suspend方法将该线程挂起。不过这个方法容易导致死锁,尽量不免使用该方法

         当线程被阻塞后,其他线程将有机会执行。被阻塞的线程会在合适的时候重新进入就绪状态,注意是就绪状态不是运行状态。

    也就是被阻塞线程在阻塞解除后,必须重新等待线程调度器再次调用它。

    针对上面线程阻塞的情况,发生以下特定的情况可以解除阻塞,让进程进入就绪状态:

        A、调用sleep方法的经过了指定的休眠时间

        B、线程调用的阻塞IO已经返回,阻塞方法执行完毕

        C、线程成功获得了试图同步的监视器

        D、线程正在等待某个通知,其他线程发出了通知

        E、处于挂起状态的线程调用了resume恢复方法

         线程从阻塞状态只能进入就绪状态,无法进入运行状态。而就绪和运行状态之间的转换通常不受程序控制,而是由系统调度所致的。

    当就绪状态的线程获得资源时,该线程进入运行状态;当运行状态的线程事情处理器资源时就进入了就绪状态。

    但对调用了yield的方法就例外,此方法可以让运行状态转入就绪状态
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马