Object.wait()實現生產者消費者模式
阿新 • • 發佈:2020-10-16
主呼叫程式:
public class MainDemo { public static void main(String[] args) { Box box=new Box(); Product product=new Product(box); Customer customer =new Customer(box); Thread th1=new Thread(product); Thread th2=new Thread(customer); th1.start(); th2.start(); } }
共享資源類:
/* * 共享資料區 * */ public class Box { private int milk; private boolean state=false; /* * 加鎖呼叫 * */ public synchronized void put(int milk) { if (state){ try { /* 事件鎖: * 1.不帶引數:導致當前執行緒等待,直到另一個執行緒呼叫該物件的 notify()方法或 notifyAll()方法。 * 2.帶引數過載:導致當前執行緒等待,直到另一個執行緒呼叫該物件的 notify()方法或 notifyAll()方法,或指定的時間已過。 **/ wait(); } catch (InterruptedException e) { e.printStackTrace(); } } this.milk=milk; System.out.println("放入:"+this.milk); this.state=true; /* * 喚醒正在等待物件監視器的所有執行緒。 * */ notifyAll(); }public synchronized void get(){ if (!state){ try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("取出:"+milk); state=false; notifyAll(); } }
生產者:
/* * 生產者類 * */ public class Product implements Runnable { private Box box; public Product(Box box) { this.box = box; } @Override public void run() { for (int i=1;i<11;i++){ box.put(i); } } }
消費者:
/* * 消費者類 * */ public class Customer implements Runnable { private Box box; public Customer(Box box) { this.box = box; } @Override public void run() { while (true){ box.get(); } } }