Java Queue Arayüzü (FIFO Yapısı ve BlockingQueue Örnekleri)
Meta Açıklaması: Java Queue arayüzü ve FIFO mantığını keşfedin. Kuyruk tiplerini, metotlarını ve örnekleri öğrenin. Rabisu Bulut platformunda hemen deneyin.
🚀 Bu Rehberde Ne Öğreneceksiniz?
Bu rehber, Java Queue (Kuyruk) arayüzünün temel işlevlerini ele alacaktır. Kuyruklar, gerçek hayattaki sıralar gibi FIFO (First In First Out) düzenini takip eder.
Öğeleri kuyruğun sonundan ekleyip, başından çıkarmak için kullanılan ana metotları göreceğiz. Ayrıca farklı kuyruk türlerini (BlockingQueue, sınırlı/sınırsız kuyruklar) ve uygulama örneklerini inceleyeceğiz.
💡 Hızlı Teknik Özeti
| Özellik | Açıklama |
|---|---|
| Veri Yapısı | FIFO (İlk Giren İlk Çıkar) |
| Paket | java.util |
| Temel Uygulamalar | LinkedList, PriorityQueue, ArrayBlockingQueue |
| Eşzamanlı Sürümler | BlockingQueue, ConcurrentLinkedQueue |
| Kullanım Alanı | Görev sıralama, üretici-tüketici yapısı, işlem kuyruğu |
🧠 1. Queue’nun Temel Kavramları
- Sıralı Liste: Queue, elemanların sıralı bir listesini temsil eder.
- FIFO Kuralı: Yeni elemanlar kuyruğun sonuna (tail) eklenir; kaldırılacak eleman baştan (head) alınır.
- Uygulayıcı Sınıflar: En sık kullanılanlar
LinkedListvePriorityQueue’dur. - Eşzamanlılık:
java.util.concurrentpaketindekiBlockingQueuearayüzünü uygulayan kuyruklar thread-safe’tir.
⚙️ 2. Queue Temel Metotları (İki Form)
| Operasyon | İstisna Fırlatan | Özel Değer Döndüren | Açıklama |
|---|---|---|---|
| Ekleme (Insert) | add(e) | offer(e) | Elemanı kuyruğa ekler. |
| Kaldırma (Remove) | remove() | poll() | Kuyruğun başındaki elemanı alır ve kaldırır. |
| İnceleme (Examine) | element() | peek() | Kuyruğun başındaki elemanı alır, kaldırmaz. |
🧩 3. Sınırlı ve Sınırsız Kuyruk Tipleri
| Tür | Açıklama | Örnek |
|---|---|---|
| Sınırlı (Bounded) | Maksimum kapasite belirlenir, dolunca ekleme engellenir. | ArrayBlockingQueue |
| Sınırsız (Unbounded) | Dinamik olarak büyüyebilir, kapasite sınırı yoktur. | LinkedList, PriorityQueue |
🔁 4. Blocking ve Non-Blocking Queue Farkı
| Tür | Açıklama |
|---|---|
| BlockingQueue | Ekleme veya kaldırma işlemleri koşul gerçekleşene kadar bekler (put(), take()). |
| Non-BlockingQueue | İşlem başarısızsa hemen döner, bekleme yapmaz. |
💻 5. Adım Adım Queue Kullanım Örnekleri
🔹 Adım 1: LinkedList Kullanarak Queue Oluşturma
package com.rabisu.kuyruk;
import java.util.*;
public class QueueExample {
public static void main(String[] args) {
// LinkedList, Queue arayüzünü uygular.
Queue<String> kuyruk = new LinkedList<>();
kuyruk.add("bir");
kuyruk.add("iki");
kuyruk.add("üç");
System.out.println(kuyruk);
kuyruk.remove("üç"); // Belirli bir elemanı kaldırır.
System.out.println(kuyruk.size());
System.out.println(kuyruk.contains("iki"));
}
}
Bu kod, LinkedList ile bir kuyruk oluşturur ve temel Collection metotlarını kullanır.
🔹 Adım 2: offer() ve add() Farkı (Sınırlı Kuyruk)
import java.util.concurrent.*;
public class QueueOfferOperation {
public static void main(String[] args) {
// Kapasitesi 2 olan sınırlı bir kuyruk oluşturur.
BlockingQueue<String> kuyruk = new ArrayBlockingQueue<>(2);
kuyruk.offer("bir");
kuyruk.offer("iki");
System.out.println(kuyruk);
// Kapasite doludur, false döndürür.
System.out.println(kuyruk.offer("üç"));
}
}
Bu örnekte, offer("üç") metodu kuyruk dolu olduğu için false döndürür.
🔹 Adım 3: poll() ve remove() Farkı
import java.util.*;
public class QueuePollOperation {
public static void main(String[] args) {
Queue<String> kuyruk = new LinkedList<>();
kuyruk.offer("bir");
kuyruk.offer("iki");
// Başarılı kaldırma işlemi
System.out.println(kuyruk.poll());
System.out.println(kuyruk.poll());
// Kuyruk boşaldı, null döndürür.
System.out.println(kuyruk.poll());
}
}
Bu kod, kuyruk boşaldığında poll() metodunun null döndürdüğünü gösterir.
💬 6. Sıkça Sorulan Sorular (SSS)
- FIFO kuralı tam olarak ne anlama gelir?
First In First Out (İlk Giren, İlk Çıkar) anlamına gelir. Kuyruğa en erken giren eleman, ilk olarak işlemden çıkarılır.
- Deque nedir ve Queue'dan farkı nedir?
Deque (Double Ended Queue), hem başından hem sonundan ekleme/kaldırma yapılabilen bir yapıdır. Queue yalnızca baştan kaldırır.
- BlockingQueue nerede kullanılır?
Özellikle Üretici/Tüketici (Producer/Consumer) deseninde, çoklu iş parçacığı senaryolarında kullanılır. İşlem tamamlanana kadar bekleyebilir.
- Sınırlı (Bounded) ve Sınırsız (Unbounded) Kuyruk ne demektir?
Sınırlı kuyruklar belirli bir kapasiteyle oluşturulur, dolunca ekleme yapılamaz. Sınırsız kuyruklar dinamik olarak genişler.
- peek() ve element() farkı nedir?
İkisi de baştaki elemanı kaldırmadan gösterir. Kuyruk boşsa peek() null döndürür, element() ise NoSuchElementException fırlatır.
🔚 Sonuç
Queue arayüzü, işlem sırasının önemli olduğu her sistemde kritik bir rol oynar. Verimlilik ve hata yönetimi için doğru kuyruk tipini seçmek performansı doğrudan etkiler.
Bu yapıları Rabisu Bulut üzerinde güçlü bir sanal sunucuda (instance) kurarak, çok iş parçacıklı uygulamalarınızı test etmeye hemen başlayabilirsiniz. ☁️