Java 線程生產(chǎn)者/消費(fèi)者

2018-02-28 14:26 更新

Java線程教程 - Java線程生產(chǎn)者/消費(fèi)者


生產(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é)果。



以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)