多線程--wait()和notify(),Thread中的等待和喚醒方法

package com.thread.test; public class SimpleMN { final static Object object = new Object(); public static class T1 extends Thread { @Override public void run() { synchronized (object) { System.out.println(System.currentTimeMillis() + ":T1 start!"); try { System.out.println(System.currentTimeMillis() + ":T1 Wait for Object"); object.wait(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(System.currentTimeMillis() + ":T1 end"); } } } public static class T2 extends Thread { @Override public void run() { synchronized (object) { System.out.println(System.currentTimeMillis() + ":T2 start!notify T1"); object.notify(); System.out.println(System.currentTimeMillis() + ":T2 end"); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } } } } public static void main(String[] args) { Thread t1 = new T1(); Thread t2 = new T2(); t1.start(); t2.start(); } }

執行結果以下ide

1516328141717:T1 start!
1516328141717:T1 Wait for Object 1516328141717:T2 start!notify T1 1516328141717:T2 end 1516328143717:T1 end

上述代碼中開啓兩個線程T1和T2。T1執行了object.wait()方法,注意在執行wait()方法前T1先申請了object的對象鎖,所以在執行obect.wati()時,spa

它是持有object的對象鎖的。wait()方法執行後T1進入等待和狀態,並示範object對象鎖。T2在執行notify()以前也會先獲取object對象鎖。T1被喚醒後線程

作的第一件事兒並非執行後續的代碼,而是要嘗試獲取object的對象鎖。爲了讓是效果更明顯,我特地在notify()以後讓T2睡眠了2s(仔細看輸出結果中的時間戳),這樣能夠更加code

明顯的說明T1在獲得notify()通知後,仍是會先嚐試從新獲取object對象鎖,然之後執行後續代碼。對象

相關文章
相關標籤/搜索