Java生產者消費者
阿新 • • 發佈:2018-12-19
package mythreed; /** * 生產者 */ public class Producter implements Runnable { @Override public void run() { synchronized (MainApp.lock) { while (true) { double timer = Math.random(); try { Thread.sleep((long) (timer * 1000)); } catch (InterruptedException e) { e.printStackTrace(); } MainApp.queue.add(timer + ""); System.out.println("生產了一條資料" + timer); if (MainApp.queue.size() > 5) { MainApp.lock.notifyAll(); try { System.out.println("生產者等待"); MainApp.lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } } } }
package mythreed; /** * 消費者 */ public class Consumer implements Runnable { @Override public void run() { synchronized (MainApp.lock) { while (true) { for (String msg : MainApp.queue) { try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("消費了一條資料"+MainApp.queue.poll()); } System.out.println("消費者等待"); MainApp.lock.notifyAll(); try { MainApp.lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } } }
package mythreed; import java.util.Queue; import java.util.concurrent.ArrayBlockingQueue; /** * 測試生產者消費者 */ public class MainApp { public static volatile Queue<String> queue = new ArrayBlockingQueue<>(6); public static Object lock = new Object(); public static void main(String[] args) { Producter producter = new Producter(); Thread thread1 = new Thread(producter); thread1.start(); Consumer consumer = new Consumer(); Thread thread2 = new Thread(consumer); thread2.start(); } }