這篇文章帶給大家的內容是關於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中文網其他相關文章!