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(); } } } }
Main.java
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!