Java 线程生产者/消费者
2018-02-28 14:26 更新
Java线程教程 - Java线程生产者/消费者
生产者/消费者是使用wait()和notify()方法的典型线程同步问题。
例子
有四个类:缓冲区,生产者,消费者和生产者CumerumerTest。
Buffer类的一个对象具有一个整数数据元素,它将由生产者生成并由消费者消费。
我们必须同步对缓冲区的访问,因此只有当缓冲区为空时,生产者才产生一个新的数据元素,而消费者只有在可用时才消耗缓冲区的数据。
ProducerConsumerTest类用于测试程序。
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; } }
上面的代码生成以下结果。
以上内容是否对您有帮助:
← Java 多线程
更多建议: