CodeBlanks Logo Icon CodeBlanks

Concurrent katmanı

ExecutorService ile paralel işlemleri yazarsın.

ExecutorService ile görev

Bu derste ExecutorService ile bir görevi eşzamanlı calistiracaksin. Executors.newSingleThreadExecutor() tek is parçacıklı bir havuz oluşturur; submit bir Callable alır ve bir Future döndürür.

ExecutorService pool = Executors.newSingleThreadExecutor();
Future<Integer> future = pool.submit(task);
int total = future.get();
pool.shutdown();

future.get() görev tamamlanana kadar bekler ve sonucu döndürür. Tek is parçacıklı havuzda çıktı sırası deterministik olduğundan beklenen çıktı her seferinde aynıdır. Is bitince shutdown ile havuzu kapatırsan.

Callable ve Future

Callable<V> sonuç döndüren bir görevdir; call() yöntemi V türünden değer verir. Future<V> gelecekte olusacak sonucu tutar; .get() sonucu hazır olana dek bekler.

Callable<Integer> task = () -> {
    int sum = 0;
    for (Transaction t : ledger) sum += t.amount;
    return sum;
};

Bu görev listedeki tüm tutarları toplar. submit(task) ile çalıştırıp future.get() ile sonucu alırsın. Lambda, Callable'in tek yöntemini otomatik olarak uygular.

Uygulama Concurrent toplam hesapla

Önceki dersin ledger listesini kullan. ExecutorService pool = Executors.newSingleThreadExecutor(); ile havuz oluştur. Callable<Integer> task lambdası ile listedeki tüm tutarları topla. pool.submit(task).get() ile sonucu al ve System.out.println ile yazdır. Son olarak pool.shutdown() çağır.

Başlangıç kodu

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

class Transaction {
    String category;
    int amount;
    Transaction(String category, int amount) {
        this.category = category;
        this.amount = amount;
    }
}

public class Main {
    public static void main(String[] args) throws Exception {
        ArrayList<Transaction> ledger = new ArrayList<>();
        ledger.add(new Transaction("market", 120));
        ledger.add(new Transaction("fuel", 80));
        var filtered = ledger.stream()
            .filter(t -> t.amount > 100)
            .toList();
        // ExecutorService ile bir Callable gönder, toplam dondur
    }
}

Örnek çözüm

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

class Transaction {
    String category;
    int amount;
    Transaction(String category, int amount) {
        this.category = category;
        this.amount = amount;
    }
}

public class Main {
    public static void main(String[] args) throws Exception {
        ArrayList<Transaction> ledger = new ArrayList<>();
        ledger.add(new Transaction("market", 120));
        ledger.add(new Transaction("fuel", 80));
        var filtered = ledger.stream()
            .filter(t -> t.amount > 100)
            .toList();
        ExecutorService pool = Executors.newSingleThreadExecutor();
        Callable<Integer> task = () -> {
            int sum = 0;
            for (Transaction t : ledger) sum += t.amount;
            return sum;
        };
        Future<Integer> future = pool.submit(task);
        int total = future.get();
        pool.shutdown();
        System.out.println(total);
    }
}

Beklenen çıktı

200

Soru ve cevaplar

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

1 ExecutorService neyin yerine geçer?

  • Sınıf tanımının
  • Stream işleminin
  • Elle Thread oluşturmanın Doğru cevap
  • Test yazmanın

Açıklama: ExecutorService, doğrudan new Thread yerine kullanılır.

2 submit çağrısını tamamla

Soru
ExecutorService pool = Executors.newSingleThreadExecutor();
Future<Integer> future = pool.____(task);
Cevap
ExecutorService pool = Executors.newSingleThreadExecutor();
Future<Integer> future = pool.submit(task);

Açıklama: submit bir Callable alır ve Future döndürür.

3 Concurrent kavramları eşleştir

Kavram Anlamı
ExecutorService Görev havuzu
Callable Sonuç döndüren görev
Future Beklenen sonuç
submit Görevi gönderir

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