sleep,yield,wait,notify,notifyAll
阿新 • • 發佈:2017-09-04
獲取鎖 一個 ted log tar div [] wake pla
1.wait,notify,notifyAll是Object的方法。他們必須在同步塊中使用,並且當前線程必須已經獲取了鎖。wait方法,用來釋放同步塊對象上的鎖,並且等待其他的線程喚醒(notify)。notify用來喚醒某一個線程,但是不會立即釋放鎖,被喚醒線程可以再次獲取鎖。notifyAll喚醒所有等待在object上面的線程,使得他們都可以再次獲取鎖。
用一個例子,來查看wait,notify的使用
public class Test { public static void main(String[] args) { new Test().test(); }View Codeprivate Thread t1 = new Thread(this::waitTest); private Thread t2 = new Thread(this::notifyTest); private Object o = new Object(); public void test(){ t1.start(); t2.start(); } public void waitTest() { synchronized (o) { System.out.println("before wait");try { o.wait(); } catch (InterruptedException e) { //do nothing } System.out.println("wake up"); } } public void notifyTest(){ //休眠一段時間 讓wait線程先獲取鎖 sleep(); synchronized (o){ System.out.println(); o.notify(); o.notify(); System.out.println("notify over"); sleep(); sleep(); System.out.println("notify sleep over"); } } public void sleep(){ try { System.out.println("sleep 3000 ms"); Thread.sleep(3000); System.out.println("sleep over"); } catch (InterruptedException e) { //do nothing } } }
2.sleep,yield是Thread的靜態方法。sleep用來讓當前線程休眠一段時間,在這段時間內,他不會獲得CPU時間,yield()方法稱為“退讓”,它把運行機會讓給了同等優先級的其他線程,但是也有可能該線程會繼續進行。sleep和yield不必須在同步塊中運行,也就是說他們其實沒有太大的聯系。如果在同步塊中使用,他們都不會釋放鎖。sleep,yield總是作用於當前線程,因此用這種方式來使用sleep和yield是錯誤的。
Thread t = new Thread; t.sleep(); t.yield(); //他們並不能讓線程t進行休眠或退讓,而是作用與當前線程
sleep,yield,wait,notify,notifyAll