1. 程式人生 > >java併發之阻塞

java併發之阻塞

1、阻塞的概念

指的是暫停一個執行緒的執行,以等待某個條件發生

 

2、實現執行緒阻塞的方法:

a、執行緒睡眠,呼叫Thread.sleep(long millis)方法,執行該方法的執行緒,會被阻塞millis毫秒,並轉為阻塞狀態,當毫秒數結束後,執行緒轉為就緒狀態(Runnable)

 

b、執行緒等待,Object中的wait()例項方法,該方法最終呼叫的是一個native方法(c++方法),執行wait()方法的執行緒,會讓自己等待,處於阻塞狀態。 除非有其他的執行緒呼叫同一個Ojbect的notify()方法或者notifyAll()方法,會將等待的執行緒喚醒。notify()方法也是Object下的,最終呼叫的同為一個native方法。wait()與notify()&notifyAll是配套使用的

 

c、執行緒禮讓,呼叫Thread.yield()方法,執行該方法的執行緒物件,會把執行機會讓給相同或者優先順序更高的執行緒。yield()是Thread下的一個靜態方法,還是一個native方法,使呼叫該方法的執行緒會放棄當前的CPU時間,但是沒有讓執行緒阻塞,即執行緒的狀態是可執行狀態(Running),隨時可再次分得CPU時間。呼叫的yield()的效果等同於程式認為該執行緒已執行足夠的時間從而另一個執行緒

 

d、執行緒自閉(停下來,讓別人先走),join()方法,在當前執行緒中呼叫另一個執行緒的join()方法,會使當前執行緒轉入阻塞狀態,直到另一個執行緒執行完畢後,當前執行緒才由阻塞狀態轉為就緒狀態。比如Main執行緒下,呼叫工作執行緒A的join()方法,此時Main執行緒會暫停,等待A執行緒的run方法執行完畢後,Main執行緒才會再次執行