Bu eğitimde Java BlockingQueue arayüzü ve yöntemleri hakkında bilgi edineceğiz.
BlockingQueue
Java arayüzü Collections
çerçevesinde uzanır Queue
arayüz. Herhangi bir işlemin başarıyla gerçekleştirilinceye kadar beklemesini sağlar.
Örneğin, boş bir kuyruktan bir öğeyi silmek istiyorsak, bu durumda engelleme kuyruğu silme işleminin, kuyruk silinecek bazı öğeleri içerene kadar beklemesine izin verir.
BlockingQueue Uygulayan Sınıflar
Yana BlockingQueue
bir arayüz ise, biz bu doğrudan uygulanmasını sağlayamaz.
İşlevini kullanmak için BlockingQueue
, onu uygulayan sınıfları kullanmamız gerekir.
- ArrayBlockingQueue
- LinkedBlockingQueue
Engelleme kuyrukları nasıl kullanılır?
Kullanmak için java.util.concurrent.BlockingQueue
paketi ithal etmeliyiz BlockingQueue
.
// Array implementation of BlockingQueue BlockingQueue animal1 = new ArraryBlockingQueue(); // LinkedList implementation of BlockingQueue BlockingQueue animal2 = new LinkedBlockingQueue();
Burada, nesnelerin animal1 ve sınıfların animal2 oluşturduk ArrayBlockingQueue
ve LinkedBlockingQueue
sırasıyla. Bu nesneler BlockingQueue
arayüzün işlevlerini kullanabilir .
Bloklama YöntemleriQueue
Bir kuyruğun dolu veya boş olmasına bağlı olarak, engelleme kuyruğunun yöntemleri 3 kategoriye ayrılabilir:
Bir istisna oluşturan yöntemler
add()
- Kuyruğun sonundaki engelleme kuyruğuna bir öğe ekler. Kuyruk dolu ise bir istisna atar.element()
- Engelleme sırasının başını döndürür. Kuyruk boşsa bir istisna atar.remove()
- Engelleme sırasından bir öğeyi kaldırır. Kuyruk boşsa bir istisna atar.
Bir değer döndüren yöntemler
offer()
- Belirtilen öğeyi kuyruğun sonundaki engelleme kuyruğuna ekler.false
Kuyruk doluysa geri döner.peek()
- Engelleme sırasının başını döndürür. İadenull
kuyruk boşsa.poll()
- Engelleme sırasından bir öğeyi kaldırır. İadenull
kuyruk boşsa.
Teklif () ve anket () hakkında daha fazla bilgi
offer()
Ve poll()
yöntem, zaman aşımı ile birlikte kullanılabilir. Yani zaman birimlerini parametre olarak geçirebiliriz. Örneğin,
offer(value, 100, milliseconds)
Buraya,
- değer kuyruğa eklenecek öğedir
- Ve 100 milisaniyelik bir zaman aşımı belirledik
Bu, offer()
yöntemin engelleme kuyruğuna 100
milisaniyeler için bir öğe eklemeye çalışacağı anlamına gelir . Öğe 100 milisaniye içinde eklenemezse, yöntem geri döner false
.
Not: Yerine milliseconds
biz de bu sefer birimlerini kullanabilir,: days
, hours
, minutes
, seconds
, microseconds
ve nanoseconds
içinde offer()
ve poll()
yöntemler.
İşlemi engelleyen yöntemler
BlockingQueue
Ayrıca operasyonları engellemek ve kuyruk dolu veya boş olup olmadığını beklemek yöntemler sağlar.
put()
- Engelleme kuyruğuna bir öğe ekler. Kuyruk doluysa, kuyruğun bir öğe eklemek için boşluğu olana kadar bekleyecektir.take()
- Engelleme kuyruğundan bir öğeyi kaldırır ve döndürür. Kuyruk boşsa, kuyruğun silinmesi gereken unsurları olana kadar bekleyecektir.
Bir kuyruğa eleman eklemek istediğimizi varsayalım. Kuyruk doluysa, put()
yöntem kuyruğun öğe eklemek için boş alana sahip olmasını bekler.
Benzer şekilde, bir kuyruktaki öğeleri silmek istiyorsak. Kuyruk boşsa, take()
yöntem, kuyruğun silinecek öğeleri içermesini bekleyecektir.
ArrayBlockingQueue'da BlockingQueue Uygulaması
import java.util.concurrent.BlockingQueue; import java.util.concurrent.ArrayBlockingQueue; class Main ( public static void main(String() args) ( // Create a blocking queue using the ArrayBlockingQueue BlockingQueue numbers = new ArrayBlockingQueue(5); try ( // Insert element to blocking queue numbers.put(2); numbers.put(1); numbers.put(3); System.out.println("BLockingQueue: " + numbers); // Remove Elements from blocking queue int removedNumber = numbers.take(); System.out.println("Removed Number: " + removedNumber); ) catch(Exception e) ( e.getStackTrace(); ) ) )
Çıktı
BlockingSıra: (2, 1, 3) Kaldırılan Öğe: 2
Daha fazla bilgi edinmek için ArrayBlockingQueue
Java ArrayBlockingQueue adresini ziyaret edin.
Neden BlockingQueue?
Java'da, iş parçacığı için güvenli koleksiyon BlockingQueue
olarak kabul edilir . Bunun nedeni, çoklu iş parçacığı işlemlerinde yardımcı olabilmesidir.
Bir iş parçacığının kuyruğa eleman eklediğini ve başka bir iş parçacığının kuyruktan öğeleri kaldırdığını varsayalım.
Şimdi, eğer ilk iş parçacığı daha yavaş çalışıyorsa, engelleme kuyruğu ikinci iş parçacığını birinci iş parçacığı işlemini tamamlayana kadar bekletebilir.