Java 中的阻塞佇列用於實作生產者消費者模型:生產者執行緒向佇列中新增數據,消費者執行緒從佇列中讀取資料。佇列滿時,生產者阻塞直到有空間可用;佇列空時,消費者阻塞直到有資料可讀。實戰案例:快取系統、訊息佇列、管線處理等並發問題。
在Java 中使用阻塞佇列實作生產者消費者模型
##阻塞佇列是一種執行緒安全的資料結構,它可以幫助我們在生產者和消費者之間實現同步。生產者執行緒將資料加入佇列中,而消費者執行緒從佇列中讀取資料。如果佇列已滿,生產者會阻塞直到有空間可用。如果隊列為空,消費者會阻塞直到有資料可供讀取。範例程式碼:
Producer.java
import java.util.concurrent.BlockingQueue; public class Producer implements Runnable { private BlockingQueue<Integer> queue; public Producer(BlockingQueue<Integer> queue) { this.queue = queue; } @Override public void run() { for (int i = 0; i < 10; i++) { try { queue.put(i); System.out.println("Produced: " + i); } catch (InterruptedException e) { e.printStackTrace(); } } } }
Consumer.java##import java.util.concurrent.BlockingQueue;
public class Consumer implements Runnable {
private BlockingQueue<Integer> queue;
public Consumer(BlockingQueue<Integer> queue) {
this.queue = queue;
}
@Override
public void run() {
while (true) {
try {
Integer item = queue.take();
System.out.println("Consumed: " + item);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Main {
public static void main(String[] args) {
BlockingQueue<Integer> queue = new ArrayBlockingQueue<>(10);
Producer producer = new Producer(queue);
Consumer consumer = new Consumer(queue);
ExecutorService executorService = Executors.newFixedThreadPool(2);
executorService.submit(producer);
executorService.submit(consumer);
executorService.shutdown();
}
}
此模型可用來解決多種並發問題,例如:
在快取系統中,生產者執行緒產生數據,而消費者執行緒使用數據。以上是如何在 Java 中使用阻塞佇列實現生產者消費者模型?的詳細內容。更多資訊請關注PHP中文網其他相關文章!