Java ArrayBlockingQueue: Panduan Lanjutan Antrian Pemblokiran dan Operasi Thread-Safe
Java ArrayBlockingQueue
Jelajahi Java ArrayBlockingQueue – pelajari cara membuat, memanipulasi, dan menggunakan antrian pemblokiran ukuran tetap secara thread-safe dengan contoh yang jelas.
Kelas ArrayBlockingQueue dalam Java Collections Framework menyediakan antrian thread-safe yang dibatasi dan didukung oleh array. Ia mengimplementasikan antarmuka BlockingQueue, memungkinkan produser dan konsumen untuk berkoordinasi melalui operasi pemblokiran.

Membuat ArrayBlockingQueue
Impor java.util.concurrent.ArrayBlockingQueue dan buat instance dengan kapasitas tetap:
ArrayBlockingQueue<Type> queue = new ArrayBlockingQueue<>(capacity);
Di mana Type adalah tipe elemen dan capacity adalah ukuran maksimum.
Catatan: Kapasitas wajib diisi; ia menentukan ukuran terbatas queue.
Metode Inti ArrayBlockingQueue
Kelas ini mengimplementasikan semua metode dari BlockingQueue untuk menyisipkan, mengakses, dan menghapus elemen. Berikut adalah operasi yang paling sering digunakan.
Menyisipkan Elemen
add(E e) – Menambahkan elemen; melempar IllegalStateException jika penuh. offer(E e) – Menambahkan elemen; mengembalikan false jika penuh.
ArrayBlockingQueue<String> animals = new ArrayBlockingQueue<>(5); animals.add("Dog"); animals.offer("Cat"); animals.offer("Horse"); System.out.println("ArrayBlockingQueue: " + animals);
Output: ArrayBlockingQueue: [Dog, Cat, Horse]
Mengakses Elemen
peek() – Mengambil head tanpa menghapus; mengembalikan null jika kosong. iterator() – Menyediakan iterator fail-fast atas queue.
String head = animals.peek(); System.out.println("Head element: " + head); Iterator<String> it = animals.iterator(); while (it.hasNext()) { System.out.print(it.next() + ", "); }
Output: Head element: Dog diikuti oleh daftar elemen.
Menghapus Elemen
remove() – Menghapus dan mengembalikan head; melempar NoSuchElementException jika kosong. poll() – Menghapus dan mengembalikan head; mengembalikan null jika kosong. clear() – Mengkosongkan queue.
String removed1 = animals.remove(); String removed2 = animals.poll(); animals.clear(); System.out.println("Updated queue: " + animals);
Output: Updated queue: []
Operasi Pemblokiran: put() dan take()
Metode ini penting untuk pola produser-konsumen. Mereka memblokir hingga operasi dapat dilakukan, memastikan koordinasi thread.
put()
Menyisipkan elemen, menunggu jika queue penuh. Dapat melempar InterruptedException.
try { animals.put("Dog"); animals.put("Cat"); } catch (InterruptedException e) { Thread.currentThread().interrupt(); }
take()
Menghapus dan mengembalikan head, menunggu jika queue kosong. Dapat melempar InterruptedException.
try { String element = animals.take(); System.out.println("Removed: " + element); } catch (InterruptedException e) { Thread.currentThread().interrupt(); }
Metode Kemudahan Tambahan
| Metode | Deskripsi |
contains(Object o) | Mengembalikan true jika queue mengandung elemen yang ditentukan. |
size() | Mengembalikan jumlah elemen saat ini. |
toArray() | Mengonversi queue ke array. |
toString() | Representasi string dari queue. |
Mengapa Menggunakan ArrayBlockingQueue?
Karena ia menawarkan:
- Keamanan thread: Sinkronisasi bawaan untuk akses konkuren.
- Ukuran tetap: Mencegah pertumbuhan memori yang tidak terkontrol.
- Semantik pemblokiran: Mempermudah koordinasi produser-konsumen.
Saat satu thread memproduksi lebih lambat daripada konsumen, konsumen akan memblokir secara otomatis, menghindari busy-waiting dan memastikan penggunaan CPU yang efisien.