多线程深度剖析

多线程这块有个非常重要且经典的图例,可以很好的帮助我们理解多线程,搭配API文档,应该可以轻松搞定多线程了。

如图,调用线程的start方法后,线程进入可运行状态,经过系统调度器决定是否运行,而且两者可以相互转换(Running->Runnable的一种情况是分配给线程的时间片用完了),图像上方是阻塞事件引发线程进入阻塞(不可运行)状态,引起线程阻塞的事件有:调用了sleep方法、线程调用wait方法等待特定条件的满足、线程输入/输出阻塞。左下方是访问对象的synchronized方法时,首先要进入到对象的锁池等待获得对象的所,才能够进入可运行状态,经系统调度运行,而右下方是调用对象的wait方法,wait和notify以及notifyAll均隶属于Object对象,因此任何一个对象都用这些方法,而三者又都是final的,因此该方法不能被重写,也就是说,你不能通过继承来改变其行为,阅读API文档可以知道,调用wait方法的前提是已经获得对象的锁了(也就是wait方法的调用要在synchronized方法或者synchronized块里),并且调用完wait后,该线程释放掉对象的锁,进入对象锁的等待池中,直到有notify通知他,他才会醒来进入对象的锁池里,等待获得对象的锁,一旦获得对象的锁后,便进入可运行状态。

另外,需要注意的一点是,调用线程的sleep方法,线程在睡眠的过程中并不会释放掉对象的锁。

 

posted @ 2015-07-06 19:14  Code_Rush  阅读(241)  评论(0编辑  收藏  举报