Dalam tutorial ini, kita akan belajar tentang antarmuka Java BlockingQueue dan metodenya.
The BlockingQueue
antarmuka dari Jawa Collections
kerangka memperluas Queue
antarmuka. Ini memungkinkan operasi apa pun menunggu hingga berhasil dilakukan.
Misalnya, jika kita ingin menghapus sebuah elemen dari antrian kosong, maka antrian pemblokiran memungkinkan operasi delete menunggu hingga antrian berisi beberapa elemen yang akan dihapus.
Kelas yang Menerapkan BlockingQueue
Karena BlockingQueue
merupakan antarmuka, kami tidak dapat menyediakan implementasi langsungnya.
Untuk menggunakan fungsionalitas BlockingQueue
, kita perlu menggunakan kelas yang mengimplementasikannya.
- ArrayBlockingQueue
- LinkedBlockingQueue
Bagaimana cara menggunakan antrian pemblokiran?
Kita harus mengimpor java.util.concurrent.BlockingQueue
paket untuk digunakan BlockingQueue
.
// Array implementation of BlockingQueue BlockingQueue animal1 = new ArraryBlockingQueue(); // LinkedList implementation of BlockingQueue BlockingQueue animal2 = new LinkedBlockingQueue();
Di sini, kita telah membuat objek animal1 dan animal2 dari kelas ArrayBlockingQueue
dan LinkedBlockingQueue
, masing-masing. Objek-objek ini dapat menggunakan fungsionalitas BlockingQueue
antarmuka.
Metode BlockingQueue
Berdasarkan apakah antrian penuh atau kosong, metode antrian pemblokiran dapat dibagi menjadi 3 kategori:
Metode yang memunculkan pengecualian
add()
- Menyisipkan elemen ke antrian pemblokiran di akhir antrian. Melempar pengecualian jika antrian penuh.element()
- Mengembalikan kepala antrian pemblokiran. Melempar pengecualian jika antrian kosong.remove()
- Menghapus elemen dari antrian pemblokiran. Melempar pengecualian jika antrian kosong.
Metode yang mengembalikan beberapa nilai
offer()
- Menyisipkan elemen yang ditentukan ke antrian pemblokiran di akhir antrian. Kembalifalse
jika antrian penuh.peek()
- Mengembalikan kepala antrian pemblokiran. Kembalinull
jika antrian kosong.poll()
- Menghapus elemen dari antrian pemblokiran. Kembalinull
jika antrian kosong.
Selengkapnya tentang offer () dan poll ()
The offer()
dan poll()
metode dapat digunakan dengan timeout. Artinya, kita dapat melewatkan satuan waktu sebagai parameter. Sebagai contoh,
offer(value, 100, milliseconds)
Sini,
- nilai adalah elemen yang akan dimasukkan ke antrian
- Dan kami telah menyetel waktu tunggu 100 milidetik
Ini berarti offer()
metode tersebut akan mencoba memasukkan elemen ke antrian pemblokiran selama 100
milidetik. Jika elemen tidak dapat disisipkan dalam 100 milidetik, metode akan kembali false
.
Catatan: Alih-alih milliseconds
, kita juga bisa menggunakan unit waktu ini: days
, hours
, minutes
, seconds
, microseconds
dan nanoseconds
dalam offer()
dan poll()
metode.
Metode yang memblokir operasi
The BlockingQueue
juga menyediakan metode untuk memblokir operasi dan menunggu jika antrian penuh atau kosong.
put()
- Menyisipkan elemen ke antrian pemblokiran. Jika antrian penuh, itu akan menunggu sampai antrian memiliki ruang untuk memasukkan elemen.take()
- Menghapus dan mengembalikan elemen dari antrian pemblokiran. Jika antrian kosong, itu akan menunggu sampai antrian memiliki elemen untuk dihapus.
Misalkan, kita ingin memasukkan elemen ke dalam antrian. Jika antrian penuh maka put()
metode akan menunggu sampai antrian memiliki ruang untuk memasukkan elemen.
Begitu pula jika kita ingin menghapus elemen dari sebuah antrian. Jika antrian kosong maka take()
metode akan menunggu sampai antrian berisi elemen untuk dihapus.
Implementasi BlockingQueue di ArrayBlockingQueue
import java.util.concurrent.BlockingQueue; import java.util.concurrent.ArrayBlockingQueue; class Main ( public static void main(String() args) ( // Create a blocking queue using the ArrayBlockingQueue BlockingQueue numbers = new ArrayBlockingQueue(5); try ( // Insert element to blocking queue numbers.put(2); numbers.put(1); numbers.put(3); System.out.println("BLockingQueue: " + numbers); // Remove Elements from blocking queue int removedNumber = numbers.take(); System.out.println("Removed Number: " + removedNumber); ) catch(Exception e) ( e.getStackTrace(); ) ) )
Keluaran
BlockingQueue: (2, 1, 3) Elemen yang Dihapus: 2
Untuk mempelajari lebih lanjut ArrayBlockingQueue
, kunjungi Java ArrayBlockingQueue.
Mengapa BlockingQueue?
Di Java, BlockingQueue
dianggap sebagai koleksi thread-safe . Itu karena dapat membantu dalam operasi multi-threading.
Misalkan satu utas memasukkan elemen ke antrian dan utas lain menghapus elemen dari antrian.
Sekarang, jika utas pertama berjalan lebih lambat, antrean pemblokiran dapat membuat utas kedua menunggu hingga utas pertama menyelesaikan operasinya.