wait、notify生產者與消費者模型
阿新 • • 發佈:2021-11-27
package com.mayikt.thread.days02; /** * @author 餘勝軍 * @ClassName Thread04 * @qq 644064779 * @addres www.mayikt.com * 微信:yushengjun644 */ public class Thread04 { /** * 共享物件 res */ class Res { public String userName; public char sex; /** * flag 預設值==false * flag false 輸入執行緒 輸入值 輸出執行緒 * flag true 輸出執行緒 輸出值*/ public boolean flag = false; } /** * 第一次 輸出餘勝軍,男 * 第二次 輸出小薇,女 * 第三次 輸出餘勝軍,男 * 第四次 輸出小薇,女 */ class InputThread extends Thread { private Res res; public InputThread(Res res) { this.res = res; } @Overridepublic void run() { int count = 0; while (true) { synchronized (res) { if (res.flag) { try { res.wait(); } catch (InterruptedException e) { e.printStackTrace(); } }if (count == 0) { res.userName = "餘勝軍"; res.sex = '男'; } else { res.userName = "小薇"; res.sex = '女'; } // 輸出執行緒 輸出值 res.flag = true; // 喚醒輸出執行緒 res.notify(); } // 1%2 = 2%2 3%2 4%2= count = (count + 1) % 2; } } } /** * 輸出的執行緒 */ class OutPutThread extends Thread { private Res res; public OutPutThread(Res res) { this.res = res; } @Override public void run() { while (true) { synchronized (res) { if (!res.flag) { // 如果 res.flag=false 則 輸出的執行緒 主動釋放鎖 同時會阻塞該執行緒 try { res.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(res.userName + "," + res.sex); // 輸出完畢 交給我們的輸入執行緒繼續的輸入 res.flag = false; res.notify();; } } } } public static void main(String[] args) { new Thread04().print(); } public void print() { // 全域性物件 Res res = new Res(); // 輸入執行緒 InputThread inputThread = new InputThread(res); OutPutThread outPutThread = new OutPutThread(res); inputThread.start(); outPutThread.start(); } }