Java BlockingQueue: Antrian Thread-Safe dengan Operasi Pemblokiran
Java BlockingQueue
Panduan ini menjelajahi antarmuka Java BlockingQueue, implementasinya, kategori metode, dan penggunaan dalam dunia nyata.
Antarmuka BlockingQueue, bagian dari Java Collections framework, memperluas Queue dan menambahkannya dengan perilaku pemblokiran. Operasi seperti penyisipan dan penghapusan akan menunggu secara otomatis hingga kondisi queue memungkinkan tindakan tersebut.
Misalnya, mencoba menghapus elemen dari queue kosong akan memblokir thread pemanggil hingga item tersedia, memastikan koordinasi yang aman antara produser dan konsumen.
Implementasi Konkret
Karena BlockingQueue adalah antarmuka, kelas konkret menyediakan fungsionalitas asli:
ArrayBlockingQueue – queue FIFO berbasis array dengan batas ukuran. LinkedBlockingQueue – implementasi daftar berambilan yang opsi batas ukurannya.

Menggunakan BlockingQueue
Impor paket sebelum membuat instance:
import java.util.concurrent.BlockingQueue; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.LinkedBlockingQueue;
Contoh instance:
// Array implementation of BlockingQueue BlockingQueue<String> animal1 = new ArrayBlockingQueue<>(10); // LinkedList implementation of BlockingQueue BlockingQueue<String> animal2 = new LinkedBlockingQueue<>();
Kedua objek mendukung semua metode yang didefinisikan oleh antarmuka BlockingQueue.
Kategori Metode
Metode BlockingQueue dikelompokkan berdasarkan reaksi mereka saat queue penuh atau kosong:
Metode yang Melempar Pengecualian
add(E e) – menyisipkan elemen; melempar IllegalStateException jika penuh. element() – mengambil, tanpa menghapus, head; melempar NoSuchElementException jika kosong. remove() – menghapus head; melempar NoSuchElementException jika kosong.
Metode dengan Nilai Kembali
offer(E e) – menyisipkan elemen; mengembalikan false jika penuh. peek() – mengambil head; mengembalikan null jika kosong. poll() – menghapus head; mengembalikan null jika kosong.
Varian dengan Batas Waktu
Kedua offer dan poll mendukung timeout:
boolean success = queue.offer(item, 100, TimeUnit.MILLISECONDS);
Dalam contoh ini, metode mencoba menyisipkan item selama hingga 100 milidetik, mengembalikan false jika operasi melebihi waktu. Satuan waktu yang didukung meliputi days, hours, minutes, seconds, milliseconds, microseconds, dan nanoseconds.
Metode Pemblokiran
put(E e) – menyisipkan elemen, memblokir jika queue penuh hingga ruang tersedia. take() – menghapus dan mengembalikan head, memblokir jika queue kosong hingga elemen disisipkan.
Metode ini penting untuk pola produser-konsumen di mana thread harus disinkronkan tanpa busy-waiting.
Contoh ArrayBlockingQueue
import java.util.concurrent.BlockingQueue; import java.util.concurrent.ArrayBlockingQueue; public class Main { public static void main(String[] args) { // Create a bounded blocking queue with capacity 5 BlockingQueue<Integer> numbers = new ArrayBlockingQueue<>(5); try { // Insert elements – will block if the queue becomes full numbers.put(2); numbers.put(1); numbers.put(3); System.out.println("BlockingQueue: " + numbers); // Remove an element – will block if the queue is empty int removedNumber = numbers.take(); System.out.println("Removed Number: " + removedNumber); } catch (InterruptedException e) { Thread.currentThread().interrupt(); System.err.println("Operation interrupted: " + e.getMessage()); } } }
Output
BlockingQueue: [2, 1, 3] Removed Number: 2
Untuk wawasan lebih dalam, konsultasikan dokumentasi Java resmi tentang ArrayBlockingQueue.
Mengapa Menggunakan BlockingQueue?
Keunggulan inti dari BlockingQueue adalah keamanan thread bawaan. Ia menghilangkan kebutuhan akan sinkronisasi eksplisit ketika banyak thread secara bersamaan memproduksi dan mengonsumsi data.
Pertimbangkan thread produser yang memasukkan item dengan kecepatan lebih lambat daripada thread konsumen yang menghapusnya. Tanpa perilaku pemblokiran, konsumen dapat melempar pengecualian atau berputar dalam loop busy-wait. Sebuah BlockingQueue secara otomatis menangguhkan konsumen hingga produser membuat data baru tersedia, dan sebaliknya.
Dengan memanfaatkan mekanisme pemblokiran bawaan ini, pengembang dapat membangun aplikasi konkuren yang kuat dan dapat diskalakan dengan kode boilerplate minimal.
---