0Pricing
Java Academy · Ders

Görev Gönderme: Runnable ve Callable

Runnable ve Callable görevlerini gönderin, sonuçları Future aracılığıyla alın.

Görev Gönderme: Runnable ve Callable, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Java Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Java Academy kursu toplamda 4 dersten oluşur.

Çalıştırılabilir ile Çağrılabilir

ExecutorService'e gönderilen görevleri iki işlevsel arayüz temsil eder:

  • Çalıştırılabilir: dönüş değeri yoktur, denetimli istisnalar bildiremez
  • Çağrılabilir<V>: V türünde bir sonuç döndürür, denetimli istisnalar fırlatabilir
import java.util.concurrent.*;

// Runnable — no return value
Runnable r = () -> System.out.println("Running");

// Callable<Integer> — returns a value
Callable<Integer> c = () -> {
    return 42; // or do computation
};

submit(Runnable)

submit(Runnable) bir Future<?> döndürür. Üzerinde get() çağrısı yapmak null döndürür ancak görevin tamamlandığını doğrular (görev başarısız olduysa istisna fırlatır).

ExecutorService pool = Executors.newFixedThreadPool(2);

Future<?> future = pool.submit(() ->
    System.out.println("Task done on " + Thread.currentThread().getName())
);

future.get(); // waits for completion; returns null
System.out.println("Task confirmed complete");
pool.shutdown();

submit(Callable<V>)

submit(Callable) bir Future<V> döndürür. Sonucu almak için future.get() çağrısını yapınız (tamamlanana kadar engeller).

ExecutorService pool = Executors.newFixedThreadPool(2);

Callable<Integer> sumTask = () -> {
    int sum = 0;
    for (int i = 1; i <= 100; i++) sum += i;
    return sum;
};

Future<Integer> future = pool.submit(sumTask);
Integer result = future.get(); // blocks until done
System.out.println("Sum 1..100 = " + result); // 5050
pool.shutdown();

invokeAll ile Birden Çok Çağrılabilir Gönderme

invokeAll() bir Çağrılabilir koleksiyonu gönderir ve bir Future listesi döndürür; döndürmeden önce hepsi tamamlanır:

List<Callable<String>> tasks = List.of(
    () -> "Result A",
    () -> "Result B",
    () -> "Result C"
);

ExecutorService pool = Executors.newFixedThreadPool(3);
List<Future<String>> futures = pool.invokeAll(tasks);

for (Future<String> f : futures) {
    System.out.println(f.get());
}
pool.shutdown();

invokeAny: İlk Başarılı Sonuç

invokeAny() bir Çağrılabilir koleksiyonu gönderir ve başarıyla tamamlanan ilk görevin sonucunu döndürür; geri kalanları iptal eder:

List<Callable<String>> candidates = List.of(
    () -> { Thread.sleep(200); return "Slow"; },
    () -> { Thread.sleep(50);  return "Fast"; },
    () -> { Thread.sleep(100); return "Medium"; }
);

ExecutorService pool = Executors.newFixedThreadPool(3);
String winner = pool.invokeAny(candidates);
System.out.println("First: " + winner); // Fast
pool.shutdown();

execute() ile submit() Karşılaştırması

execute(Runnable) görevi başlatır ve sonucu beklemez; Future döndürülmez, yakalanmamış istisna işleyicisi eklemediğiniz sürece istisnalar kaybolur. submit() görevi bir Future içine sarar ve istisnaları get() aracılığıyla alınmak üzere yakalar.

ExecutorService pool = Executors.newFixedThreadPool(2);

// execute: exception silently lost
pool.execute(() -> { throw new RuntimeException("Oops!"); });

// submit: exception captured in Future
Future<?> f = pool.submit(() -> { throw new RuntimeException("Oops!"); });
try {
    f.get();
} catch (ExecutionException e) {
    System.out.println("Caught: " + e.getCause().getMessage());
}
pool.shutdown();

Denetimli İstisnalara Sahip Çağrılabilir

Çalıştırılabilirden farklı olarak Çağrılabilir, denetimli istisnalar fırlatabilir; bu da onu G/Ç ve veritabanı işlemleri için doğal bir seçim hâline getirir:

Callable<String> dbQuery = () -> {
    // This compiles fine — checked exception is declared on Callable.call()
    if (Math.random() < 0.5) throw new java.sql.SQLException("DB error");
    return "row data";
};

Future<String> f = pool.submit(dbQuery);
try {
    String data = f.get();
} catch (ExecutionException e) {
    if (e.getCause() instanceof java.sql.SQLException) {
        System.out.println("DB failed: " + e.getCause().getMessage());
    }
}

Bağımsız Hesaplamaları Paralelleştirme

Bağımsız hesaplamaları paralel olarak yürütmek için birden çok Çağrılabilir görevi gönderiniz:

ExecutorService pool = Executors.newFixedThreadPool(4);

Future<Long> sumFuture  = pool.submit(() -> LongStream.rangeClosed(1,1_000_000).sum());
Future<Long> prodFuture = pool.submit(() -> LongStream.rangeClosed(1,20).reduce(1L, (a,b)->a*b));

long sum  = sumFuture.get();
long prod = prodFuture.get();
System.out.println("Sum: " + sum + ", 20!: " + prod);
pool.shutdown();

Çağrılabilir Sonuçlarını Birleştirme

Birçok görev gönderiniz ve tümü tamamlandığında sonuçları birleştiriniz:

int N = 8;
ExecutorService pool = Executors.newFixedThreadPool(N);
List<Future<Integer>> futures = new ArrayList<>();

for (int i = 0; i < N; i++) {
    final int chunk = i;
    futures.add(pool.submit(() -> chunk * chunk)); // i^2
}

int total = 0;
for (Future<Integer> f : futures) total += f.get();
System.out.println("Sum of squares: " + total);
pool.shutdown();

Çağrılabilir İçin Zaman Aşımı

Sonsuza kadar beklememek için future.get(timeout, unit) çağrısına bir zaman aşımı geçiriniz:

Future<String> f = pool.submit(() -> {
    Thread.sleep(5000); // slow task
    return "done";
});
try {
    String result = f.get(1, TimeUnit.SECONDS);
} catch (TimeoutException e) {
    System.out.println("Task timed out");
    f.cancel(true); // interrupt the task
} catch (ExecutionException e) {
    System.out.println("Task failed: " + e.getCause());
}

En İyi Uygulamalar

En iyi uygulamaların özeti:

  • execute() yerine submit() kullanınız; istisnalar yakalanır
  • Dönüş değerine veya denetimli istisnalara ihtiyaç duyduğunuzda Çağrılabilir kullanınız
  • Her zaman zaman aşımıyla future.get() çağrısını yapınız
  • Toplu işleme için invokeAll, ilk yanıtın kazanması için invokeAny kullanınız
  • Havuzu her zaman kapatınız

Hızlı Kontrol

Çağrılabilirin Çalıştırılabilir karşısındaki temel avantajı nedir?

Özet: Çalıştırılabilir ile Çağrılabilir

Temel çıkarımlar:

  • Çalıştırılabilir: değer döndürmez, denetimli istisnalar yoktur; submit boş değer içeren bir Future döndürür
  • Çağrılabilir: V döndürür, denetimli istisnalar fırlatabilir; submit Future<V> döndürür
  • invokeAll: bir grup görev gönderir ve tümünün bitmesini bekler
  • invokeAny: ilk başarılı sonucu döndürür, geri kalanları iptal eder
  • İstisnaları yakalamak için her zaman submit() kullanınız

Sıkça Sorulan Sorular

“Görev Gönderme: Runnable ve Callable” dersi ücretsiz mi?

Evet — “Görev Gönderme: Runnable ve Callable” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Java Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Java Academy kursu toplamda 4 dersten oluşur.

“Görev Gönderme: Runnable ve Callable” dersinde ne öğreneceğim?

Runnable ve Callable görevlerini gönderin, sonuçları Future aracılığıyla alın. Java Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Java Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Java Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.

“Görev Gönderme: Runnable ve Callable” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Java Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Java Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. ExecutorService ve İş Parçacığı Havuzu Türleri
  2. Görev Gönderme: Runnable ve Callable
  3. Future ve Hata İşleme
  4. Yinelenen Görevler için ScheduledExecutorService
← Java Academy Sayfasına Dön