生產(chǎn)者/消費(fèi)者是使用wait()和notify()方法的典型線程同步問(wèn)題。
有四個(gè)類(lèi):緩沖區(qū),生產(chǎn)者,消費(fèi)者和生產(chǎn)者CumerumerTest。
Buffer類(lèi)的一個(gè)對(duì)象具有一個(gè)整數(shù)數(shù)據(jù)元素,它將由生產(chǎn)者生成并由消費(fèi)者消費(fèi)。
我們必須同步對(duì)緩沖區(qū)的訪問(wèn),因此只有當(dāng)緩沖區(qū)為空時(shí),生產(chǎn)者才產(chǎn)生一個(gè)新的數(shù)據(jù)元素,而消費(fèi)者只有在可用時(shí)才消耗緩沖區(qū)的數(shù)據(jù)。
ProducerConsumerTest類(lèi)用于測(cè)試程序。
import java.util.Random; class Consumer extends Thread { private Buffer buffer; public Consumer(Buffer buffer) { this.buffer = buffer; } public void run() { int data; while (true) { data = buffer.consume(); } } } public class Main { public static void main(String[] args) { Buffer buffer = new Buffer(); Producer p = new Producer(buffer); Consumer c = new Consumer(buffer); p.start(); c.start(); } } class Producer extends Thread { private Buffer buffer; public Producer(Buffer buffer) { this.buffer = buffer; } public void run() { Random rand = new Random(); while (true) { int n = rand.nextInt(); buffer.produce(n); } } } class Buffer { private int data; private boolean empty; public Buffer() { this.empty = true; } public synchronized void produce(int newData) { while (!this.empty) { try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } this.data = newData; this.empty = false; this.notify(); System.out.println("Produced:" + newData); } public synchronized int consume() { while (this.empty) { try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } this.empty = true; this.notify(); System.out.println("Consumed:" + data); return data; } }
上面的代碼生成以下結(jié)果。
更多建議: