Bu öğreticide, LinkedBLockingQueue sınıfı ve yöntemleri hakkında örnekler yardımıyla öğreneceğiz.
LinkedBlockingQueue
Java sınıf Collections
çerçevesi bağlantılı listesini kullanarak engelleme kuyruk uygulanmasını sağlar.
Java BlockingQueue arayüzünü uygular.
LinkedBlockingQueue Oluşturma
Bağlantılı bir engelleme kuyruğu oluşturmak için java.util.concurrent.LinkedBlockingQueue
paketi içe aktarmalıyız .
Java'da bağlantılı bir engelleme kuyruğunu şu şekilde oluşturabiliriz:
1. Başlangıç kapasitesi olmadan
LinkedBlockingQueue animal = new LinkedBlockingQueue();
Burada varsayılan başlangıç kapasitesi 2 31 -1 olacaktır.
2. İlk kapasite ile
LinkedBlockingQueue animal = new LinkedBlockingQueue(int capacity);
Buraya,
- Tür - bağlantılı engelleme kuyruğunun türü
- kapasite - bağlantılı engelleme kuyruğunun boyutu
Örneğin,
// Creating String type LinkedBlockingQueue with size 5 LinkedBlockingQueue animals = new LinkedBlockingQueue(5); // Creating Integer type LinkedBlockingQueue with size 5 LinkedBlockingQueue age = new LinkedBlockingQueue(5);
Not: Bağlantılı listenin boyutunu belirtmek zorunlu değildir.
LinkedBlockingQueue Yöntemleri
LinkedBlockingQueue
Sınıf BlockingQueue arayüzündeki tüm yöntemlerin uygulanmasını sağlar.
Bu yöntemler, bağlantılı engelleme kuyruklarından öğeleri eklemek, bunlara erişmek ve silmek için kullanılır.
Ayrıca, iki yöntem hakkında bilgi edineceksiniz put()
ve take()
bağlantılı engelleme kuyruğunda bu desteğin engelleme çalışma.
Bu iki yöntem, bağlantılı engelleme kuyruğunu diğer tipik kuyruklardan ayırır.
Eleman Ekle
add()
- Bağlantılı engelleme kuyruğuna belirli bir öğe ekler. Kuyruk dolu ise bir istisna atar.offer()
- Bağlantılı engelleme kuyruğuna belirli bir öğe ekler.false
Kuyruk dolu ise geri döner .
Örneğin,
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); ) )
Çıktı
LinkedBlockingQueue: (Köpek, Kedi, At)
Erişim Öğeleri
peek()
- Bağlı engelleme kuyruğunun önünden bir öğe döndürür.null
Kuyruk boşsa geri döner .iterator()
- Bağlı engelleme kuyruğundan bir öğeye sıralı olarak erişmek için bir yineleyici nesnesi döndürür. Kuyruk boşsa bir istisna atar. Kullanmak içinjava.util.Iterator
paketi ithal etmeliyiz .
Örneğin,
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(", "); ) ) )
Çıktı
LinkedBlockingQueue: (Dog, Cat, Horse) Erişilen Öğe: Köpek Bağlantılı Bloklama Sıra Öğeleri: Köpek, Kedi, At,
Öğeleri Kaldır
remove()
- Bağlı engelleme kuyruğundan belirtilen bir öğeyi döndürür ve kaldırır. Kuyruk boşsa bir istisna atar.poll()
- Bağlı engelleme kuyruğundan belirtilen bir öğeyi döndürür ve kaldırır.null
Kuyruk boşsa geri döner .clear()
- Bağlantılı engelleme kuyruğundan tüm öğeleri kaldırır.
Örneğin,
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); ) )
Çıktı
LinkedBlockingQueue: (Köpek, Kedi, At) Kaldırılan Öğeler: remove () kullanma: Anket kullanan Köpek (): Kedi Güncellendi LinkedBlockingQueue: ()
put () ve take () Yöntemleri
Çok iş parçacıklı işlemlerde, bir iş parçacığını başka bir iş parçacığı ile senkronize etmek için kullanabilir put()
ve take()
engelleyebiliriz. Bu yöntemler, başarıyla yürütülebilene kadar bekleyecektir.
put () Yöntem
Belirtilen öğeyi bağlantılı bir engelleme kuyruğunun sonuna eklemek için put()
yöntemi kullanırız .
Bağlantılı engelleme kuyruğu doluysa, bağlantılı engelleme kuyruğunda öğeyi eklemek için boşluk kalana kadar bekler.
Örneğin,
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); ) ) )
Çıktı
LinkedBlockingQueue: (Köpek, Kedi)
Burada put()
yöntem InterruptedException
beklerken kesintiye uğrarsa bir atabilir . Bu nedenle, onu bir try… catch bloğunun içine almalıyız.
take () Yöntemi
Bağlantılı engelleme kuyruğunun önünden bir öğeyi geri döndürmek ve kaldırmak için take()
yöntemi kullanabiliriz .
Bağlı engelleme kuyruğu boşsa, bağlantılı engelleme kuyruğunda silinecek öğeler bulunana kadar bekler.
Örneğin,
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); ) ) )
Çıktı
LinkedBlockingQueue: (Dog, Cat) Kaldırılan Öğe: Dog New LinkedBlockingQueue: (Kedi)
Burada take()
yöntem InterrupedException
beklerken kesintiye uğrarsa bir atacaktır . Bu nedenle, onu bir try… catch
bloğun içine almalıyız .
Diğer yöntemler. Diğer metodlar
Yöntemler | Açıklamalar |
---|---|
contains(element) | Belirtilen öğe için bağlantılı engelleme kuyruğunu arar. Eleman bulunursa true , değilse geri döner false . |
size() | Bağlı engelleme kuyruğunun uzunluğunu döndürür. |
toArray() | Bağlı engelleme kuyruğunu bir diziye dönüştürür ve diziyi döndürür. |
toString() | Bağlı engelleme kuyruğunu dizeye dönüştürür |
LinkedBlockingQueue neden kullanılıyor?
LinkedBlockingQueue
Kullandığı dahili depolamanın yanı listelerini bağladı.
İş parçacığı açısından güvenli bir koleksiyon olarak kabul edilir . Bu nedenle, genellikle çok iş parçacıklı uygulamalarda kullanılır.
Diyelim ki, bir iş parçacığı kuyruğa öğeler ekliyor ve başka bir iş parçacığı kuyruktan öğeleri kaldırıyor.
Şimdi, ilk iş parçacığı ikinci iş parçacığından daha yavaşsa, bağlantılı engelleme kuyruğu, ikinci iş parçacığının ilk iş parçacığı işlemlerini tamamlayana kadar beklemesini sağlayabilir.