CodeBlanks Logo Icon CodeBlanks

Callable ve Future

Callable ve Future ile sonuçlu görevleri öğrenirsin.

Callable ve Future

Callable<V>, sonuç döndüren bir görev arayüzüdür. Runnable'dan farklı olarak call() yöntemi bir değer döndürür ve Exception fırlatabilir. Future<V> ise sonucu zamanında almayı sağlar.

Callable<Integer> task = () -> 2 + 3;
Future<Integer> f = pool.submit(task);
Integer result = f.get();

get() görev bitene kadar bekler. get(timeout, unit) belirli bir süre sonra TimeoutException fırlatır. Bu, yanıtı olmayan görevleri engellemek için kullanılır. Hata durumunda ExecutionException alırsın; nedeni getCause() ile öğrenilir.

get ile zaman aşımı

Future.get(long, TimeUnit) belirli bir süre bekler; süre aşılırsa TimeoutException fırlatır. Bu, yanıtı olmayan görevleri engellemek için kullanılır.

try {
    Integer r = f.get(1, TimeUnit.SECONDS);
} catch (TimeoutException e) {
    f.cancel(true);
}

cancel(true) görevi bölerek iptal eder. Bu, uzun süren işlemlerde sistemi korur. isDone() ile görevin bitip bitmediğini sorgulayabilirsin. Bu denetimler, üretim eşzamanlı kodunda kritiktir.

Uygulama Callable ile sonuç al

Bir CallableDemo sınıfında main yaz; Executors.newSingleThreadExecutor() ile havuz oluştur. Callable<Integer> task = () -> 6 * 7 tanımla; pool.submit(task) ile Future<Integer> al. f.get() sonucunu System.out.println ile yazdır. Son olarak pool.shutdown() çağır.

Başlangıç kodu

Main.java
import java.util.concurrent.*;

// CallableDemo sınıfında main yaz

// Callable görevi tanımla (6*7 döndürsün)

// submit ile Future al; get ile sonucu yazdır; shutdown çağır

Örnek çözüm

Main.java
import java.util.concurrent.*;

class CallableDemo {
    public static void main(String[] args) throws Exception {
        ExecutorService pool = Executors.newSingleThreadExecutor();
        Callable<Integer> task = () -> 6 * 7;
        Future<Integer> f = pool.submit(task);
        System.out.println(f.get());
        pool.shutdown();
    }
}

Beklenen çıktı

42

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Callable yöntemini tamamla

Soru
Callable<Integer> task = () -> 2 + 3;
Future<Integer> f = pool.submit(task);
Integer result = f.____();
Cevap
Callable<Integer> task = () -> 2 + 3;
Future<Integer> f = pool.submit(task);
Integer result = f.get();

Açıklama: Future.get() sonucu bekler.

2 Future.get() çağrıldığında ne olur?

  • Hemen sonuç döner
  • Görevi yeniden başlatır
  • Görevi iptal eder
  • Görev bitene kadar çağırıcıyı bloklar Doğru cevap

Açıklama: get() görev bitene kadar çağırıcıyı bloklar.

3 Callable/Future kavramlarını eşleştir

Kavram Anlamı
Callable Sonuç döndüren görev
Future Sonucu temsil eder
get() Bekleyip sonucu alır
cancel() Görevi iptal eder

İleri seviye bölümündeki tüm dersler