Dalam tutorial ini, kita akan belajar mengenai kelas LinkedBLockingQueue dan kaedahnya dengan bantuan contoh.
The LinkedBlockingQueue
kelas Jawa Collections
rangka 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.LinkedBlockingQueue
pakej.
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 LinkedBlockingQueue
kelas 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 kembalifalse
sekiranya 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 kembalinull
sekiranya barisan kosong.iterator()
- Mengembalikan objek berulang untuk mengakses elemen secara berurutan dari barisan penyekat yang dipautkan. Ia membuang pengecualian sekiranya barisan kosong. Kita mesti mengimportjava.util.Iterator
pakej 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 kembalinull
sekiranya 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 InterruptedException
jika 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 InterrupedException
jika terganggu semasa menunggu. Oleh itu, kita mesti memasukkannya ke dalam try… catch
blok.
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 LinkedBlockingQueue
senarai 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.