package dev.elaine.concurrency;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

public final class ThreadPoolSaturationSample {
    private ThreadPoolSaturationSample() {
    }

    public static int runExperiment() throws InterruptedException {
        CountDownLatch releaseWorker = new CountDownLatch(1);
        AtomicInteger rejected = new AtomicInteger();
        ThreadPoolExecutor executor = new ThreadPoolExecutor(
                1, 1, 0, TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(1),
                (task, pool) -> rejected.incrementAndGet());
        try {
            executor.execute(() -> await(releaseWorker));
            executor.execute(() -> System.out.println("排队任务执行"));
            executor.execute(() -> System.out.println("这个任务会被拒绝"));
            releaseWorker.countDown();
        } finally {
            executor.shutdown();
            executor.awaitTermination(2, TimeUnit.SECONDS);
        }
        return rejected.get();
    }

    private static void await(CountDownLatch latch) {
        try {
            latch.await();
        } catch (InterruptedException exception) {
            Thread.currentThread().interrupt();
        }
    }

    public static void main(String[] args) throws InterruptedException {
        System.out.println("拒绝任务数=" + runExperiment());
    }
}
