import java.util.List;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.atomic.AtomicInteger;

public class RingkasanPraktik {

    // 1) state dibagi minim: hanya penghitung atomik dan antrean pesan
    private static final AtomicInteger dicatat = new AtomicInteger();
    private static final ConcurrentLinkedQueue<String> log = new ConcurrentLinkedQueue<>();

    public static void main(String[] args) throws Exception {
        List<String> kota = List.of("Jakarta", "Bandung", "Surabaya", "Medan", "Palembang");

        // 2) executor, bukan Thread mentah -- pool dikelola rapi
        try (ExecutorService pool = Executors.newFixedThreadPool(3)) {
            // 3) hasil sebagai Future yang ditunggu terurut -- tanpa println dari task
            List<Future<String>> hasil = kota.stream()
                    .map(k -> pool.submit(() -> proses(k)))
                    .toList();

            for (Future<String> f : hasil) {
                System.out.println(f.get());
            }
        } // try-with-resources: shutdown otomatis

        System.out.println("total diproses : " + dicatat.get());
    }

    private static String proses(String kota) {
        catatLog(kota);
        dicatat.incrementAndGet();
        return "laporan cuaca " + kota + " selesai";
    }

    private static void catatLog(String kota) {
        log.add("memproses " + kota);
    }
}
