CodeBlanks Logo Icon CodeBlanks

Concurrent katmanı

ExecutorService ile paralel iş akışı yazarsın.

ExecutorService ile toplam

Bu derste ExecutorService ile toplam önem seviyesini eşzamanlı hesaplayacaksın. Executors.newSingleThreadExecutor() tek is parçacıklı bir havuz oluşturur; submit bir Callable alır.

ExecutorService pool = Executors.newSingleThreadExecutor();
Callable<Integer> task = () -> {
    int sum = 0;
    for (Event e : log) sum += e.severity;
    return sum;
};
int total = pool.submit(task).get();
pool.shutdown();

future.get() görev tamamlanana kadar bekler. Tek is parçacıklı havuzda çıktı sırası deterministik olduğundan beklenen çıktı her seferinde aynıdır.

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 (Event e : log) sum += e.severity;
    return sum;
};

Bu görev listedeki tüm önem seviyelerini toplar. pool.submit(task).get() ile sonucu alırsın.

Uygulama Concurrent toplam hesapla

Önceki dersin log listesini kullan. ExecutorService pool = Executors.newSingleThreadExecutor(); ile havuz oluştur. Callable<Integer> task lambdası ile listedeki tüm önem seviyelerini 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 Event {
    String type;
    int severity;
    Event(String type, int severity) {
        this.type = type;
        this.severity = severity;
    }
}

public class Main {
    public static void main(String[] args) throws Exception {
        ArrayList<Event> log = new ArrayList<>();
        log.add(new Event("info", 1));
        log.add(new Event("error", 5));
        log.add(new Event("warn", 3));
        // ExecutorService ile toplam severity hesapla
    }
}

Örnek çözüm

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

class Event {
    String type;
    int severity;
    Event(String type, int severity) {
        this.type = type;
        this.severity = severity;
    }
}

public class Main {
    public static void main(String[] args) throws Exception {
        ArrayList<Event> log = new ArrayList<>();
        log.add(new Event("info", 1));
        log.add(new Event("error", 5));
        log.add(new Event("warn", 3));
        ExecutorService pool = Executors.newSingleThreadExecutor();
        Callable<Integer> task = () -> {
            int sum = 0;
            for (Event e : log) sum += e.severity;
            return sum;
        };
        int total = pool.submit(task).get();
        pool.shutdown();
        System.out.println(total);
    }
}

Beklenen çıktı

9

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
  • Test yazmanın
  • Elle Thread oluşturmanın Doğru cevap

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

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

Soru
ExecutorService pool = Executors.newSingleThreadExecutor();
Callable<Integer> task = () -> { /* toplam */ return 9; };
int total = pool.____(task).get();
Cevap
ExecutorService pool = Executors.newSingleThreadExecutor();
Callable<Integer> task = () -> { /* toplam */ return 9; };
int total = pool.submit(task).get();

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