所谓的阻塞,就是线程能够运行,但是某个条件阻止它的运行,当线程处于阻塞状态时,调度器将忽略线程,不会分配给线程任何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.任务试图在某个对象上调用其同步控制方法,但是对象锁不可用,因为另一个任务已经获取这个锁;
线程处于等待(阻塞)状态的场景
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() )