Rumah >Java >javaTutorial >Bagaimana untuk Melaksanakan Barisan Pengeluar-Pengguna dengan Cekap di Jawa?

Bagaimana untuk Melaksanakan Barisan Pengeluar-Pengguna dengan Cekap di Jawa?

Barbara Streisand
Barbara Streisandasal
2024-11-15 15:13:02573semak imbas

How to Efficiently Implement a Producer-Consumer Queue in Java?

Melaksanakan Barisan Pengeluar-Pengguna

Dalam pengaturcaraan serentak, corak pengeluar-pengguna memerlukan benang pengeluar menghasilkan item untuk baris gilir dan benang pengguna memakannya. Melaksanakan corak ini dengan baris gilir memerlukan pertimbangan yang teliti.

Pelaksanaan Alternatif:

Pilihan 1: Baris Statik

Dalam ini pendekatan, baris gilir statik dikongsi antara benang pengeluar dan pengguna. Setiap utas secara langsung mengakses baris gilir, yang berpotensi menimbulkan konflik. Walaupun benang-selamat, ia boleh membawa kepada isu konkurensi dengan berbilang urutan mengakses baris gilir secara serentak.

Pilihan 2: Baris Berasaskan Contoh

Daripada baris gilir statik, setiap pengeluar dan pengguna mempunyai contoh baris gilir sendiri. Ini memastikan keselamatan benang kerana setiap benang hanya berinteraksi dengan baris gilirnya sendiri. Walau bagaimanapun, adalah penting untuk memastikan baris gilir dihantar ke utas dengan betul.

Pelaksanaan Java 5:

Java 5 dan kemudiannya menyediakan mekanisme yang lebih canggih untuk mengurus utas dan baris gilir:

  • Gunakan dua Perkhidmatan Pelaksana: satu untuk pengeluar dan satu untuk pengguna.
  • Untuk memudahkan komunikasi, pertimbangkan BlockingQueue. Walau bagaimanapun, ia mungkin tidak diperlukan jika urutan pengguna mendapatkan semula tugasan terus daripada perkhidmatan pelaksana urutan pengeluar.

Kod Contoh:

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);

Dalam ini pelaksanaan, pengeluar menyerahkan tugas terus kepada ExecutorService benang pengguna, menghapuskan keperluan untuk beratur.

Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan Barisan Pengeluar-Pengguna dengan Cekap di Jawa?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn