執行緒間的通訊

2021-09-25 18:57:52 字數 2038 閱讀 9700

1.執行緒間的通訊:多個執行緒處理同乙個資源,但處理的動作卻不同

2.執行緒間的有效通訊:使用等待喚醒機制,實現協調通訊,讓執行緒間進行有規律的執行

3.條件:3.1 wait方法與notify方法必須由同乙個鎖物件呼叫,因為,對應的鎖物件可以通過notify喚醒使用同乙個物件呼叫的wait方法後的執行緒

3.2 wait與notify是屬於object類的方法,因為,鎖可以是任意物件,而任意物件的所屬類,都是繼承object類的

3.3 wait與notify必須要在同步**塊或者同步函式中使用,因為,必須通過鎖物件呼叫這2個方法

4.以吃貨和包子鋪做包子為例子:

執行緒a:包子鋪執行緒

執行緒b:吃貨執行緒

共同資源:包子

規律的執行:如果包子沒有,那麼包子鋪執行緒要被喚醒做包子,吃貨進行無限等待

如果包子有了,那麼吃貨要被喚醒起來吃包子,包子鋪執行緒無限等待

案例如下:

package thread.communication;

/**建立包子類,封裝包子的相關資訊

* @author jeady

* @date 2019/8/1

*/public class baozi

public void setpi(string pi)

public string getxian()

public void setxian(string xian)

public boolean isstatus()

public void setstatus(boolean status)

}

package thread.communication;

/**建立包子鋪執行緒

* @author jeady

* @date 2019/8/1

*/public class baozipu extends thread

@override

public void run() catch (interruptedexception e)

}//注意這裡是不可以用else的,當if條件滿足的時候,我們還要繼續往下執行

//有包子,包子鋪等待,吃貨吃包子

system.out.println(getname()+"包子鋪開始生產包子了");

baozi.pi= "皮薄";

baozi.xian = "肉餡兒";

system.out.println("包子鋪把包子生產好了,改變包子狀態為有,並喚醒吃貨");

baozi.status = true;

baozi.notify();}}

}}

package thread.communication;

/**建立吃貨執行緒

* @author jeady

* @date 2019/8/1

*/public class chihuo extends thread

@override

public void run() catch (interruptedexception e)

}system.out.println(getname()+"開始吃包子"+baozi.pi+baozi.xian);

system.out.println("包子吃完了,改變包子狀態為沒有包子,並喚醒包子鋪生產包子");

baozi.status = false;

baozi.notify();}}

}}

package thread.communication;

/**進行測試

* @author jeady

* @date 2019/8/1

*/public class test01

}

執行結果如下:

執行緒間的通訊

執行緒間的通訊 簡單說明 執行緒間通訊 在1個程序中,執行緒往往不是孤立存在的,多個執行緒之間需要經常進行通訊 執行緒間通訊的體現 1個執行緒傳遞資料給另1個執行緒 在1個執行緒中執行完特定任務後,轉到另1個執行緒繼續執行任務 執行緒間通訊常用方法 06 nsthread04 執行緒間通訊 impo...

執行緒間的通訊

常用的 wait notify notifyall 在乙個執行緒裡面,喚醒其他擁有同樣的鎖的執行緒 使用wait notify notifyall 時,塊必須上鎖 author fzz public class communicate catch interruptedexception e sys...

執行緒間的通訊

public class demo1 catch interruptedexception e system.out.println flag is true start new thread catch interruptedexception e system.out.println flag ...