package com.flaremicro.visualforecast; import java.util.concurrent.locks.LockSupport; import com.flaremicro.visualforecast.interfaces.Tickable; public class TickThread implements Runnable { private final Tickable tickable; private boolean running = true; private final long sleepNanos; //private long nextTick = 0; TickThread(Tickable tickable, long sleepNanos) { this.tickable = tickable; this.sleepNanos = sleepNanos; } TickThread(Tickable tickable, int ticksPerSecond) { this(tickable, (long) ((1/(double)ticksPerSecond) * 1000000000L)); } public void end() { this.running = false; } public void run() { long nanosLost = 0; while (running) { /*while(System.nanoTime() < nextTick) { try { Thread.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } } nextTick = System.nanoTime() + sleepNanos; tickable.tick();*/ tickable.tick(); nanosLost -= System.nanoTime(); //Unnecessary conditional? //if(sleepNanos+nanosLost > 0) LockSupport.parkNanos(sleepNanos+nanosLost); nanosLost = System.nanoTime(); } } }