package com.epickrram.workshop.perf.app.jitter; import com.epickrram.workshop.perf.support.Threads; import java.util.concurrent.ExecutorService; import java.util.concurrent.TimeUnit; import static com.epickrram.workshop.perf.support.DaemonThreadFactory.DAEMON_THREAD_FACTORY; import static java.util.concurrent.Executors.newFixedThreadPool; public enum Spinners { SPINNERS; private static final long BUSY_SPIN_PERIOD_NANOS = TimeUnit.MILLISECONDS.toNanos(3L); private static final long SLEEP_PERIOD_NANOS = TimeUnit.MILLISECONDS.toNanos(30L); private volatile boolean running = false; public void start() { running = true; final int processors = Runtime.getRuntime().availableProcessors(); final ExecutorService executorService = newFixedThreadPool(processors, DAEMON_THREAD_FACTORY); for(int i = 0; i < processors; i++) { executorService.submit(new Spinner()); } } public void stop() { running = false; } private class Spinner implements Runnable { private long counter = 0; @Override public void run() { while(running) { final long stopSpinningAt = System.nanoTime() + BUSY_SPIN_PERIOD_NANOS; while(System.nanoTime() < stopSpinningAt) { counter++; } Threads.THREADS.sleep(SLEEP_PERIOD_NANOS, TimeUnit.NANOSECONDS); } } public long getCounter() { return counter; } } }