Java LinkedBlockingQueue

Dalam tutorial ini, kita akan belajar tentang kelas LinkedBLockingQueue dan metodenya dengan bantuan contoh.

The LinkedBlockingQueuekelas dari Java Collectionsframework menyediakan implementasi antrian memblokir menggunakan linked list.

Ini mengimplementasikan antarmuka Java BlockingQueue.

Membuat LinkedBlockingQueue

Untuk membuat antrian pemblokiran tertaut, kita harus mengimpor java.util.concurrent.LinkedBlockingQueuepaket.

Berikut adalah bagaimana kita dapat membuat antrian pemblokiran yang terhubung di Java:

1. Tanpa kapasitas awal

 LinkedBlockingQueue animal = new LinkedBlockingQueue(); 

Di sini kapasitas awal default adalah 2 31 -1.

2. Dengan kapasitas awal

 LinkedBlockingQueue animal = new LinkedBlockingQueue(int capacity); 

Sini,

  • Jenis - jenis antrian pemblokiran yang ditautkan
  • kapasitas - ukuran antrian pemblokiran yang ditautkan

Sebagai contoh,

 // Creating String type LinkedBlockingQueue with size 5 LinkedBlockingQueue animals = new LinkedBlockingQueue(5); // Creating Integer type LinkedBlockingQueue with size 5 LinkedBlockingQueue age = new LinkedBlockingQueue(5); 

Catatan: Tidak wajib memberikan ukuran daftar tertaut.

Metode LinkedBlockingQueue

The LinkedBlockingQueuekelas menyediakan implementasi dari semua metode dalam antarmuka BlockingQueue.

Metode ini digunakan untuk memasukkan, mengakses, dan menghapus elemen dari antrian pemblokiran terkait.

Selain itu, kita akan belajar tentang dua metode put()dan take()yang mendukung operasi pemblokiran dalam antrian pemblokiran terkait.

Kedua metode ini membedakan antrian pemblokiran terkait dari antrian tipikal lainnya.

Sisipkan Elemen

  • add()- Menyisipkan elemen tertentu ke antrian pemblokiran yang ditautkan. Itu melempar pengecualian jika antrian penuh.
  • offer()- Menyisipkan elemen tertentu ke antrian pemblokiran yang ditautkan. Ia kembali falsejika antrian penuh.

Sebagai contoh,

 import java.util.concurrent.LinkedBlockingQueue; class Main ( public static void main(String() args) ( LinkedBlockingQueue animals = new LinkedBlockingQueue(5); // Using add() animals.add("Dog"); animals.add("Cat"); // Using offer() animals.offer("Horse"); System.out.println("LinkedBlockingQueue: " + animals); ) ) 

Keluaran

 LinkedBlockingQueue: (Anjing, Kucing, Kuda) 

Elemen Akses

  • peek()- Mengembalikan elemen dari depan antrian pemblokiran yang ditautkan. Ia kembali nulljika antrian kosong.
  • iterator()- Mengembalikan objek iterator untuk mengakses elemen secara berurutan dari antrian pemblokiran yang ditautkan. Itu melempar pengecualian jika antrian kosong. Kita harus mengimpor java.util.Iteratorpaket untuk menggunakannya.

Sebagai contoh,

 import java.util.concurrent.LinkedBlockingQueue; import java.util.Iterator; class Main ( public static void main(String() args) ( LinkedBlockingQueue animals = new LinkedBlockingQueue(5); // Add elements animals.add("Dog"); animals.add("Cat"); animals.add("Horse"); System.out.println("LinkedBlockingQueue: " + animals); // Using peek() String element = animals.peek(); System.out.println("Accessed Element: " + element); // Using iterator() Iterator iterate = animals.iterator(); System.out.print("LinkedBlockingQueue Elements: "); while(iterate.hasNext()) ( System.out.print(iterate.next()); System.out.print(", "); ) ) ) 

Keluaran

 LinkedBlockingQueue: (Dog, Cat, Horse) Accessed Element: Dog LinkedBlockingQueue Elements: Dog, Cat, Horse, 

Hapus Elemen

  • remove()- Mengembalikan dan menghapus elemen tertentu dari antrian pemblokiran terkait. Itu melempar pengecualian jika antrian kosong.
  • poll()- Mengembalikan dan menghapus elemen tertentu dari antrian pemblokiran terkait. Ia kembali nulljika antrian kosong.
  • clear() - Menghapus semua elemen dari antrian pemblokiran yang ditautkan.

Sebagai contoh,

 import java.util.concurrent.LinkedBlockingQueue; class Main ( public static void main(String() args) ( LinkedBlockingQueue animals = new LinkedBlockingQueue(5); animals.add("Dog"); animals.add("Cat"); animals.add("Horse"); System.out.println("LinkedBlockingQueue " + animals); // Using remove() String element1 = animals.remove(); System.out.println("Removed Element:"); System.out.println("Using remove(): " + element1); // Using poll() String element2 = animals.poll(); System.out.println("Using poll(): " + element2); // Using clear() animals.clear(); System.out.println("Updated LinkedBlockingQueue " + animals); ) ) 

Keluaran

 LinkedBlockingQueue: (Dog, Cat, Horse) Elemen yang Dihapus: Menggunakan remove (): Dog Using poll (): Cat Updated LinkedBlockingQueue: () 

put () dan take () Metode

Dalam proses multithreading, kita dapat menggunakan put()dan take()memblokir operasi satu utas untuk menyinkronkannya dengan utas lain. Metode ini akan menunggu hingga berhasil dijalankan.

put () Metode

Untuk memasukkan elemen yang ditentukan ke akhir antrian pemblokiran terkait, kami menggunakan put()metode.

Jika antrian pemblokiran yang ditautkan sudah penuh, ia menunggu sampai ada ruang di antrian pemblokiran yang ditautkan untuk memasukkan elemen.

Sebagai contoh,

 import java.util.concurrent.LinkedBlockingQueue; class Main ( public static void main(String() args) ( LinkedBlockingQueue animals = new LinkedBlockingQueue(5); try ( // Add elements to animals animals.put("Dog"); animals.put("Cat"); System.out.println("LinkedBlockingQueue: " + animals); ) catch(Exception e) ( System.out.println(e); ) ) ) 

Keluaran

 LinkedBlockingQueue: (Anjing, Kucing) 

Di sini, put()metode mungkin melempar InterruptedExceptionjika terputus saat menunggu. Oleh karena itu, kita harus memasukkannya ke dalam blok try… catch.

take () Metode

Untuk mengembalikan dan menghapus elemen dari depan antrian pemblokiran yang ditautkan, kita dapat menggunakan take()metode ini.

Jika antrian pemblokiran tertaut kosong, ia menunggu sampai ada elemen dalam antrian pemblokiran tertaut untuk dihapus.

Sebagai contoh,

 import java.util.concurrent.LinkedBlockingQueue; class Main ( public static void main(String() args) ( LinkedBlockingQueue animals = new LinkedBlockingQueue(5); try ( //Add elements to animals animals.put("Dog"); animals.put("Cat"); System.out.println("LinkedBlockingQueue: " + animals); // Remove an element String element = animals.take(); System.out.println("Removed Element: " + element); System.out.println("New LinkedBlockingQueue: " + animals); ) catch(Exception e) ( System.out.println(e); ) ) ) 

Keluaran

 LinkedBlockingQueue: (Dog, Cat) Elemen yang Dihapus: Dog New LinkedBlockingQueue: (Cat) 

Di sini, take()metode akan menampilkan InterrupedExceptionjika terputus saat menunggu. Oleh karena itu, kita harus memasukkannya ke dalam try… catchblok.

Metode Lain

Metode Deskripsi
contains(element) Mencari antrian pemblokiran terkait untuk elemen yang ditentukan. Jika elemen ditemukan, ia kembali true, jika tidak ia kembali false.
size() Menampilkan panjang antrean pemblokiran yang ditautkan.
toArray() Mengonversi antrean pemblokiran tertaut menjadi larik dan mengembalikan larik.
toString() Mengubah antrian pemblokiran yang ditautkan menjadi string

Mengapa menggunakan LinkedBlockingQueue?

The LinkedBlockingQueuepenggunaan terkait daftar sebagai penyimpanan internal.

Ini dianggap sebagai koleksi yang aman untuk benang . Oleh karena itu, umumnya digunakan dalam aplikasi multi-threading.

Misalkan, satu utas memasukkan elemen ke antrean dan utas lainnya menghapus elemen dari antrean.

Sekarang, jika utas pertama lebih lambat dari utas kedua, maka antrean pemblokiran yang ditautkan dapat membuat utas kedua menunggu hingga utas pertama menyelesaikan operasinya.

Artikel yang menarik...