Callable ve Future
- Java kursu
- İleri seviye
- Ders 62/82
- 5 dk
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
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
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
Callable<Integer> task = () -> 2 + 3;
Future<Integer> f = pool.submit(task);
Integer result = f.____();
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 |