Java LinkedBlockingQueue

Bu öğreticide, LinkedBLockingQueue sınıfı ve yöntemleri hakkında örnekler yardımıyla öğreneceğiz.

LinkedBlockingQueueJava 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.LinkedBlockingQueuepaketi 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

LinkedBlockingQueueSı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. falseKuyruk 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. nullKuyruk 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çin java.util.Iteratorpaketi 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. nullKuyruk 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 InterruptedExceptionbeklerken 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 InterrupedExceptionbeklerken kesintiye uğrarsa bir atacaktır . Bu nedenle, onu bir try… catchbloğ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?

LinkedBlockingQueueKullandığı 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.

Ilginç makaleler...