Merhabalar arkadaşlar. Bu yazıda Queue Interface konusuna geçiyor olacağız. Temelde tüm Collection üyelerinde olduğu gibi Collection Interface’i kalıtan Queue arabirimi (interface) elemanlarını işlemek için bir öncelik sıralamasına tabi tutar. Oracle’ın dökümanına göre şart olmamakla birlikte Queue arabirimi bir süpermarket kuyruğu gibi ilk giren ilk çıkar (FIFO) algoritmasını uygular. Queue arabirimi Collection Interface’den aldıklarının yanında kendisi de ilave metotlar sunar. Bunlar şöyledir:

public interface Queue<E> extends Collection<E> {
    E element();
    boolean offer(E e);
    E peek();
    E poll();
    E remove();
}

Burada Collection Interface içindeki bazı metotlarla temelde aynı işi yapan ama iş yapış şekli değişik olan metotlar yer alıyor. Metotlar’ın bir kısmı işlemi gerçekleştirirken bir hata meydana gelmesi durumunda exception fırlatırken bir kısmı exception fırlatmıyor. Bunun yerine null ya da false gibi değerler dönüyorlar. Konuyu biraz açalım.

  • Yukarıda gördüğümüz metotlar içinden offer metodu Queue’ya veri eklemekte kullanılır. Collection içinden gelen add metodu da aynı işi yapar. Ancak eğer bu Queue’nun kapasitesi sınırlandırılmış ise add metodu IllegalStateException hatası fırlatır, offer metodu ise false değer döndürür, bir hata fırlatmaz.
  • peek() metodu kuyruğun başındaki elemanı silmeden elde etmemize yarar. Her çalıştırılışda aynı sonucu döndürür, kuyruğa etki etmez. Eğer kuruk boş ise peek metodu null değer döner.
  • element() metodu peek metodu ile aynı işi yapar fakat eğer liste boş ise NoSuchElement hatası fırlatır.
  • poll metodu listenin en başındaki elemanı kuyruktan silerek elde etmeye yarar. Her çalıştırılmasında bir sonraki elemanı silerek elde eder. Eğer kuyruk boşsa null değer döner.
  • remove metodu poll ile aynı işi yapar fakat eğer liste boşsa NoSuchElementException fırlatır.

Queue Implementations

Oracle Doc’a göre Queue arbiriminin implementasyonları iki grupta toplanmış. General-Purpose Queue Implementations denilen yani genel amaçlı kullanım olarak çevirebileceğimiz türde LinkedList ve PriorityQueue Queue’nun implementasyonlarıdır. Concurrent Queue Implementations denilen yani multithread uygulamalar için yazılmış olan türde ise nesneler aynı anda birden fazla Thread’in müdahelesine karşı korunmuş olur. Bu kısımdaki implementasyonlar şöyledir:

  • LinkedBlockingQueue — Zorunlu olmamakla beraber FIFO ile yapılmış arkada bağlı düğümler yapısını kullanılan veri türüdür.
  • ArrayBlockingQueue — FIFO kullanılan ve geri planda dizi ile işini gören veri yapısıdır.
  • PriorityBlockingQueue — Geri planda işini heap ile gören ve herhangi bir algoritma ile sınırlandırılmamış yapıdır.
  • DelayQueue — Geri planda heap ile işini gören süre tabanlı zamanlama kuyruğudur.
  • SynchronousQueue — SynchronousQueue için ingilizce kaynaklar randevulaşma veri yapısı diye adlandırma yapıyor. Bunun sebebi bir Thrad kuyruktan eleman almak ister de kuruk boş ise orayyı başka bir Thread veri koyana kadar kilitler. Ya da bir Thread veri koymuşsa o veri başka bir Thread tarafından alınana kadar orayı bloklar. Bu şekilde sanki bir randevulaşma gibi bir mekanizma uygulanır.

Bu yazıda temel olarak Queue arabirimine göz attık. Gelecek yazıda bu arabirimin imolementasyonlarından olan PriorityQueue sınıfına değineceğiz. Görüşene kadar sağlıcakla kalın.