I only quickly glanced (not even a skim) but one thing jumped out at me:
public static long getCurrentTime() { return (System.nanoTime()/1000000); }
Two major problems. First the counter position is undefined. So it would be perfectly legal for straight after a cold boot of the OS and running your program for nanoTime to be return negative values. So you really want to be subtracting from some reference time-stamp. This has the added advantage that you can simply modify this reference time stamp to handle pauses. The much bigger problem is the division. You’re throwing away important information in favor of the unimportant. The accuracy of any digital timer is +/-1 of its resolution and when you subtraction two to get a delta time, the errors compound to +/-2. Plus or minus 2 ms is long time. (Likewise you never want to accumulate deltas as they forever compound). My suggesting to to forget the divide.
public static long getCurrentTime() { return (System.nanoTime() - refTimeStamp); }