Totally jumpy here. My (rather old) mainboard has some shite chipsets which causes QPC (which is used by nanoTime) to leap. Didnt happen with win9x… does happen with 2k and above. Well, duh.
I used to use some adaptive yield loop+nanoTime, but that doesnt work anymore… for me anyways. There arent many machines affected… so you could just ignore the issue. Well, unfortunately I cant ignore it 
It caps the maximum time to spend per frame at some point and if its too late with this frame, it will hurry a bit more with the next one (so with triple buffering you wont drop a frame if some frames took a tad too long).
private long timeNow, timeThen, timeLate = 0;
[...]
g.dispose();
//throttle
long gapTo = 1000000000L/75L + timeThen;
do{
Thread.yield();
timeNow = System.nanoTime();
}while(gapTo > timeNow+timeLate);
if(gapTo<timeNow)
timeLate = timeNow-gapTo;
else
timeLate = 0;
timeThen = timeNow;
//-
strategy.show();
The other method, which I’m using now uses currentTimeMillis millis again, sorta averages the last 10 frames and adjusts the amount of yielding accordingly. Seems to work fine if the time per frame doesnt fluctuate too much. (I havent tested it that much yet, but it seems to work fine.)
private long lastFrame=0;
private long []fa=new long[10];
private int faptr=0;
private float yield=1f;
[...]
long timeNow = System.currentTimeMillis();
fa[faptr++]=timeNow-lastFrame;
if(faptr>9)faptr=0;
lastFrame=timeNow;
long sum=0;
for(int i=0;i<10;i++)
sum+=fa[i];
if(sum>160) //16msec*10 for ~62.5fps
yield*=0.95f;
else if(yield<1f)
yield=1f;
else
yield*=1.05f;
for(int i=0;i<yield;i++)
Thread.yield();
Feel free to experiment with different factors and/or less/more frames for averaging.