Concurrent katmanı
- Java kursu
- İleri seviye
- Ders 80/82
- 6 dk
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
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
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
ExecutorService pool = Executors.newSingleThreadExecutor();
Callable<Integer> task = () -> { /* toplam */ return 9; };
int total = pool.____(task).get();
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 |