1. 程式人生 > >sleep,yield,wait,notify,notifyAll

sleep,yield,wait,notify,notifyAll

獲取鎖 一個 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();
    }

    
private 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 } } }
View Code

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