zoukankan      html  css  js  c++  java
  • 线程阻塞

    所谓的阻塞,就是线程能够运行,但是某个条件阻止它的运行,当线程处于阻塞状态时,调度器将忽略线程,不会分配给线程任何CPU时间,直到线程重新进入就绪状态,它才有可能执行操作。

    为什么任务会进入阻塞的状态,一般有以下几个原因:
    1.通过调用sleep(milliseconds)使任务进入休眠状态,在这种情况下,任务在指定的时间内不会运行;
    2.通过调用wait()使线程挂起,直到线程得到了notify()或notifyAll()消息(或者java SE5的java.util.concurrent类库中等价的signal()或signalAll()),线程才会进入就绪状态;

        在.NET中的实现诸如 lock(){monitor.wait()}; autoResetEvent.waitone() ;
    3.任务在等到某个输入或输出完成;

       apm 异步模型编程中,xx.accept(),阻塞在那边等待异步IO的返回结果。

    4.任务试图在某个对象上调用其同步控制方法,但是对象锁不可用,因为另一个任务已经获取这个锁;

    线程处于等待(阻塞)状态的场景

    参考:http://blog.sina.com.cn/s/blog_6af29f290100s3y9.html

    1.处于对象等待池中的阻塞状态,在对象上调用wait或者等待某个对象的同步锁。

    2.当前线程自己sleep了,

       或者调用了其他线程的join方法,

       或者发出了一个IO请求,例如system.out.println或者read ,

       或者调用线程让步方法yield。

    当前线程静态方法:

    1.sleep:阻塞当前线程一段时间,主动行为,不会分配到CPU资源,不会释放锁。

    2.yield:阻塞当前线程一段时间,主动行为,不会分配到CPU资源,不会释放锁。(跟sleep不同的是让出cpu资源,其他高优先级或者低优先级的线程得到执行)

    当前线程实例方法:

    1.join:阻塞调用线程,让调用线程等待在那边。线程实例阻塞调用线程,直到线程执行结束。

    2.wait:阻塞当前线程一段时间,释放锁资源,并且等待信号通知。(在.NET中实现诸如  lock(){monitor.wait()} ; autoResetEvent.waitone() )

  • 相关阅读:
    CF 142B Tprimes
    CF 231A Team
    poj 2001 Shortest Prefixes ——字典树入门
    hdu 1039 Easier Done Than Said?
    poj 2528 Mayor's posters
    hdu 1061 Rightmost Digit
    poj 2503 Babelfish
    CF271 A. Beautiful Year
    poj 2752
    CF271 B. Prime Matrix
  • 原文地址:https://www.cnblogs.com/wuMing-dj/p/4901280.html
Copyright © 2011-2022 走看看