Concurrent katmanı
- Java kursu
- İleri seviye
- Ders 75/82
- 6 dk
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
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
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
ExecutorService pool = Executors.newSingleThreadExecutor();
Future<Integer> future = pool.____(task);
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 |