プロデューサー/コンシューマー キューの実装
同時プログラミングでは、プロデューサー/コンシューマー パターンは、キューのアイテムを生成するプロデューサー スレッドと、それらを消費するコンシューマ スレッド。キューを使用してこのパターンを実装するには、慎重な検討が必要です。
代替実装:
オプション 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 中国語 Web サイトの他の関連記事を参照してください。