在Java中,可以使用wait()
和notify()
或notifyAll()
方法來實(shí)現(xiàn)生產(chǎn)者-消費(fèi)者模式。這些方法是Object
類的一部分,用于線程間的通信。下面是一個(gè)簡(jiǎn)單的生產(chǎn)者-消費(fèi)者模式示例:
public class Buffer {
private int data;
private boolean empty = true;
public synchronized void put(int data) {
while (!empty) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.data = data;
empty = false;
notifyAll();
}
public synchronized int get() {
while (empty) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
empty = true;
notifyAll();
return data;
}
}
public class Producer implements Runnable {
private Buffer buffer;
public Producer(Buffer buffer) {
this.buffer = buffer;
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("Produced: " + i);
buffer.put(i);
}
}
}
public class Consumer implements Runnable {
private Buffer buffer;
public Consumer(Buffer buffer) {
this.buffer = buffer;
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
int data = buffer.get();
System.out.println("Consumed: " + data);
}
}
}
public class Main {
public static void main(String[] args) {
Buffer buffer = new Buffer();
Thread producerThread = new Thread(new Producer(buffer));
Thread consumerThread = new Thread(new Consumer(buffer));
producerThread.start();
consumerThread.start();
}
}
運(yùn)行上述代碼,你將看到生產(chǎn)者和消費(fèi)者線程交替執(zhí)行,生產(chǎn)者將數(shù)據(jù)放入緩沖區(qū),消費(fèi)者從緩沖區(qū)中取出數(shù)據(jù)。這就是一個(gè)簡(jiǎn)單的生產(chǎn)者-消費(fèi)者模式實(shí)現(xiàn)。