import java.util.ArrayList;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.atomic.AtomicInteger;

public class MadSquirrel implements Runnable {
    private final Executor executor;
    private final AtomicInteger counter = new AtomicInteger(0);

    public MadSquirrel(Executor executor) {
        this.executor = executor;
    }

    public int getCount() {
        return counter.getAndSet(0);
    }

    @Override
    public void run() {
        counter.incrementAndGet();
        executor.execute(this);
    }

    public static void main(String[] args) throws InterruptedException {
        int nSquirrels = 1;
        Executor executor = ForkJoinPool.commonPool();
        for (int i = 0; i < args.length; ++i) {
            switch (args[i]) {
                case "--work-stealing-pool": {
                    int threads = Integer.parseInt(args[++i]);
                    executor = Executors.newWorkStealingPool(threads);
                    break;
                }
                case "--fixed-thread-pool": {
                    int threads = Integer.parseInt(args[++i]);
                    executor = Executors.newFixedThreadPool(threads);
                    break;
                }
                case "--squirrels": {
                    nSquirrels = Integer.parseInt(args[++i]);
                    break;
                }
                default: {
                    System.err.printf("Unsupported argument: %s\n", args[i]);
                    System.exit(1);
                }
            }
        }

        var squirrels = new ArrayList<MadSquirrel>();
        for (int i = 0; i < nSquirrels; ++i) {
            var squirrel = new MadSquirrel(executor);
            squirrels.add(squirrel);
            executor.execute(squirrel);
        }

        while (true) {
            Thread.sleep(1000);
            var sb = new StringBuilder();
            int total = 0;
            for (int i = 0; i < squirrels.size(); ++i) {
                if (i != 0) {
                    sb.append(", ");
                }
                int count = squirrels.get(i).getCount();
                sb.append(count);
                total += count;
            }
            System.out.printf("Runs per second: %s, total = %d\n", sb.toString(), total);
        }
    }
}