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() )

  • 相关阅读:
    009-Python-面向对象
    008-Python-模块
    007-Python函数-装饰器
    006-Python函数
    005-Python字典
    003-python列表
    PyCharm之python书写规范--消去提示波浪线
    001-python基础
    Java基础总结(一)
    High ASCII字符从bat文件到dos控制台的转化问题
  • 原文地址:https://www.cnblogs.com/wuMing-dj/p/4901280.html
Copyright © 2011-2022 走看看