實現執行緒間的通訊(二)
阿新 • • 發佈:2018-11-13
非靜態的同步方法的鎖物件:this
靜態的同步方法的鎖物件是:該類的位元組碼物件
this.notify():喚醒單個等待的執行緒
this.notifyAll():喚醒所有等待的執行緒
/* * 1.在同步程式碼塊中,用哪個物件鎖,就用那個物件呼叫wait方法 * 2.為什麼wait方法和notify方法可以定義在Object這類中 * 因為鎖物件是任意物件,Object類是所有類的基類 * 3.sleep方法和wait方法的區別: * wait方法可以傳入引數(就是在引數的時間結束後等待),也可以不傳入引數(直接等待), * sleep方法在同步函式或者同步程式碼塊中,不釋放鎖 * wait方法在同步函式或者同步程式碼塊中,釋放鎖 */
JDK1.5:(三個執行緒輪流執行)
import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; public class DenoNotify2 { public static void main(String[] args) { final Print2 p=new Print2(); new Thread(){ public void run(){ while (true){ try { p.print1(); } catch (Exception e) { e.printStackTrace(); } } } }.start(); new Thread(){ public void run(){ while (true){ try { p.print2(); } catch (Exception e) { e.printStackTrace(); } } } }.start(); new Thread(){ public void run(){ while (true){ try { p.print3(); } catch (Exception e) { e.printStackTrace(); } } } }.start(); } } class Print2{ private ReentrantLock r=new ReentrantLock(); private Condition c1=r.newCondition(); private Condition c2=r.newCondition(); private Condition c3=r.newCondition(); private int flag=1; public void print1() throws Exception{ r.lock(); if (flag!=1){ c1.await(); } System.out.print("1"); System.out.print("2"); System.out.print("3"); System.out.print("4"); System.out.println("5"); flag=2; c2.signal(); r.unlock(); } public void print2() throws Exception{ r.lock(); if (flag!=2){ c2.await(); } System.out.print("上"); System.out.print("山"); System.out.print("打"); System.out.print("老"); System.out.println("虎"); flag=3; c3.signal(); r.unlock(); } public void print3() throws Exception{ r.lock(); if (flag!=3){ c3.await(); } System.out.print("a"); System.out.print("b"); System.out.print("c"); System.out.print("d"); System.out.println("e"); flag=1; c1.signal(); r.unlock(); } }