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

  • 相关阅读:
    字串变换
    单词接龙
    二叉搜索树
    搜索专题(未完)
    单调栈
    单调队列练习(切蛋糕&好消息,坏消息)
    队列专题
    滑动窗口/【模板】单调队列
    Linux下如何查看硬件信息?
    Git 居然可以用来跟女神聊天?
  • 原文地址:https://www.cnblogs.com/wuMing-dj/p/4901280.html
Copyright © 2011-2022 走看看