首頁  >  文章  >  Java  >  Java中執行緒的等待與喚醒的介紹(程式碼)

Java中執行緒的等待與喚醒的介紹(程式碼)

不言
不言轉載
2018-10-08 15:48:372937瀏覽

 這篇文章帶給大家的內容是關於Java中執行緒的等待與喚醒的介紹(程式碼),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

class ThreadA extends Thread{

    public ThreadA(String name) {
        super(name);
    }

    public void run() {
        synchronized (this) {
            System.out.println(Thread.currentThread().getName()+" call notify()");
            notify();
        }
    }
}
public class WaitTest {
    public static void main(String[] args) {
        ThreadA t1 = new ThreadA("t1");
        synchronized(t1) {
            try {
                // 启动“线程t1”
                System.out.println(Thread.currentThread().getName()+" start t1");
                t1.start();

                // 主线程等待t1通过notify()唤醒。
                System.out.println(Thread.currentThread().getName()+" wait()");
                t1.wait();

                System.out.println(Thread.currentThread().getName()+" continue");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

輸出結果:main start t1 -> main wait() -> t1 call notify() -> main continue

#其實呼叫t1.start(),t1為就緒狀態,只是main方法中,t1被main線程鎖住了,t1.wait()的時候,讓當前線程等待,其實是讓main線程等待了,然後釋放了t1鎖,t1線程執行,打印t1 call notify(),然後喚醒main線程,最後結束;

這裡說一下wait()與sleep()的區別,他們的共同點都是讓線程休眠,但是wait()會釋放物件同步鎖定,而sleep()不會;下面的程式碼t1結束之後才會執行t2;能夠證實這一點;

##

public class SleepLockTest{ 
    private static Object obj = new Object();
    public static void main(String[] args){ 
        ThreadA t1 = new ThreadA("t1"); 
        ThreadA t2 = new ThreadA("t2"); 
        t1.start(); 
        t2.start();
    } 
    static class ThreadA extends Thread{
        public ThreadA(String name){ 
            super(name); 
        } 
        public void run(){ 
            synchronized (obj) {
                try {
                    for(int i=0; i <10; i++){ 
                        System.out.printf("%s: %d\n", this.getName(), i); 
                        // i能被4整除时,休眠100毫秒
                        if (i%4 == 0)
                            Thread.sleep(100);
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        } 
    } 
}

以上是Java中執行緒的等待與喚醒的介紹(程式碼)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:cnblogs.com。如有侵權,請聯絡admin@php.cn刪除