생산자-소비자 대기열 구현
동시 프로그래밍에서 생산자-소비자 패턴에는 대기열에 대한 항목을 생성하는 생산자 스레드와 소비자 스레드가 이를 소비합니다. 대기열을 사용하여 이 패턴을 구현하려면 신중한 고려가 필요합니다.
대체 구현:
옵션 1: 정적 대기열
여기에서는 접근 방식에서는 생산자 스레드와 소비자 스레드 간에 정적 대기열이 공유됩니다. 각 스레드는 큐에 직접 액세스하므로 충돌이 발생할 수 있습니다. 스레드로부터 안전하지만 여러 스레드가 동시에 대기열에 액세스하면 동시성 문제가 발생할 수 있습니다.
옵션 2: 인스턴스 기반 대기열
정적 대기열 대신, 각 생산자와 소비자는 대기열의 자체 인스턴스를 갖습니다. 이는 각 스레드가 자체 대기열과만 상호 작용하므로 스레드 안전성을 보장합니다. 그러나 대기열이 스레드에 올바르게 전달되는지 확인하는 것이 중요합니다.
Java 5 구현:
Java 5 이상에서는 스레드 및 관리를 위한 보다 정교한 메커니즘을 제공합니다. 대기열:
샘플 코드:
final ExecutorService producers = Executors.newFixedThreadPool(100); final ExecutorService consumers = Executors.newFixedThreadPool(100); while (/* has more work */) { producers.submit(...); } producers.shutdown(); producers.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS); consumers.shutdown(); consumers.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
여기서 구현 시 생산자는 소비자 스레드의 ExecutorService에 직접 작업을 제출하므로 별도의 대기열이 필요하지 않습니다.
위 내용은 Java에서 생산자-소비자 대기열을 효율적으로 구현하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!