Java LinkedBlockingQueue

Dalam tutorial ini, kita akan belajar mengenai kelas LinkedBLockingQueue dan kaedahnya dengan bantuan contoh.

The LinkedBlockingQueuekelas Jawa Collectionsrangka kerja menyediakan pelaksanaan barisan menyekat menggunakan senarai berpaut.

Ia menerapkan antara muka Java BlockingQueue.

Membuat LinkedBlockingQueue

Untuk membuat barisan penyekat yang dipautkan, kita mesti mengimport java.util.concurrent.LinkedBlockingQueuepakej.

Inilah cara kami dapat membuat barisan blokir bertautan di Java:

1. Tanpa kapasiti awal

 LinkedBlockingQueue animal = new LinkedBlockingQueue(); 

Di sini kapasiti awal lalai adalah 2 31 -1.

2. Dengan kapasiti awal

 LinkedBlockingQueue animal = new LinkedBlockingQueue(int capacity); 

Di sini,

  • Jenis - jenis barisan penyekat yang dipautkan
  • kapasiti - ukuran barisan penyekat yang dipautkan

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 senarai yang dipautkan.

Kaedah LinkedBlockingQueue

The LinkedBlockingQueuekelas menyediakan pelaksanaan semua kaedah dalam antara muka BlockingQueue.

Kaedah-kaedah ini digunakan untuk memasukkan, mengakses dan menghapus elemen dari barisan penyekat yang dihubungkan.

Juga, kita akan belajar mengenai dua kaedah put()dan take()yang menyokong operasi penyekat dalam barisan blokir terpaut.

Kedua-dua kaedah ini membezakan barisan pemblokiran yang dihubungkan dari barisan khas yang lain.

Masukkan Elemen

  • add()- Memasukkan elemen yang ditentukan ke barisan penyekat yang dipautkan. Ia melontarkan pengecualian sekiranya barisan penuh.
  • offer()- Memasukkan elemen yang ditentukan ke barisan penyekat yang dipautkan. Ia kembali falsesekiranya barisan 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); ) ) 

Pengeluaran

 LinkedBlockingQueue: (Anjing, Kucing, Kuda) 

Elemen Akses

  • peek()- Mengembalikan elemen dari hadapan barisan penyekat yang dipautkan. Ia kembali nullsekiranya barisan kosong.
  • iterator()- Mengembalikan objek berulang untuk mengakses elemen secara berurutan dari barisan penyekat yang dipautkan. Ia membuang pengecualian sekiranya barisan kosong. Kita mesti mengimport java.util.Iteratorpakej 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(", "); ) ) ) 

Pengeluaran

 LinkedBlockingQueue: (Anjing, Kucing, Kuda) Elemen Diakses: Elemen Berpaut AnjingBlockingQueue: Anjing, Kucing, Kuda, 

Buang Elemen

  • remove()- Mengembalikan dan membuang elemen yang ditentukan dari barisan penyekat yang dipautkan. Ia membuang pengecualian sekiranya barisan kosong.
  • poll()- Mengembalikan dan membuang elemen yang ditentukan dari barisan penyekat yang dipautkan. Ia kembali nullsekiranya barisan kosong.
  • clear() - Mengeluarkan semua elemen dari barisan penyekat yang dipautkan.

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

Pengeluaran

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

meletakkan () dan ambil () Kaedah

Dalam proses multithreading, kita dapat menggunakan put()dan take()untuk menyekat operasi satu utas untuk menyegerakkannya dengan utas yang lain. Kaedah ini akan menunggu sehingga berjaya dilaksanakan.

put () Kaedah

Untuk memasukkan elemen yang ditentukan ke hujung barisan penyekat yang dipautkan, kami menggunakan put()kaedahnya.

Sekiranya barisan penyekat yang dipautkan penuh, ia menunggu sehingga ada ruang dalam barisan penyekat yang dipautkan 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); ) ) ) 

Pengeluaran

 LinkedBlockingQueue: (Anjing, Kucing) 

Di sini, put()kaedah boleh membuang InterruptedExceptionjika terganggu semasa menunggu. Oleh itu, kita mesti memasukkannya ke dalam blok cobaan … tangkapan.

ambil () Kaedah

Untuk mengembalikan dan mengeluarkan elemen dari bahagian depan barisan penyekat yang dipautkan, kita boleh menggunakan take()kaedahnya.

Sekiranya barisan penyekat yang dipautkan kosong, ia menunggu sehingga terdapat unsur-unsur dalam barisan penyekat yang dipautkan untuk dihapuskan.

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

Pengeluaran

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

Di sini, take()kaedah akan membuang InterrupedExceptionjika terganggu semasa menunggu. Oleh itu, kita mesti memasukkannya ke dalam try… catchblok.

Kaedah lain

Kaedah Penerangan
contains(element) Mencari barisan sekatan terpaut untuk elemen yang ditentukan. Sekiranya unsur itu dijumpai, ia akan kembali true, jika tidak, ia akan kembali false.
size() Mengembalikan panjang barisan penyekat yang dipautkan.
toArray() Menukar barisan penyekat yang dipautkan ke array dan mengembalikan array.
toString() Menukar barisan penyekat yang dipautkan ke rentetan

Mengapa menggunakan LinkedBlockingQueue?

Penggunaan LinkedBlockingQueuesenarai terpaut sebagai simpanan dalamannya.

Ia dianggap sebagai koleksi benang yang selamat . Oleh itu, ia biasanya digunakan dalam aplikasi multi-threading.

Katakan, satu utas memasukkan elemen ke dalam barisan dan satu lagi benang mengeluarkan unsur dari barisan.

Sekarang, jika utas pertama lebih perlahan daripada utas kedua, maka barisan penyekat yang dipautkan dapat membuat utas kedua menunggu sehingga utas pertama menyelesaikan operasinya.

Artikel menarik...