Mostly in the past its not really been the loss of resources (infact its good if your game doesn’t take up every bit of CPU) but the resolution reliability of sleep. It can be up to 5ms (?) out of the time you actually request which of course can screw up your FPS and animation (if you’ve based it on a known constant FPS rather than time passed).
Myself, I quite liked the GAGE system which loops on a Thread.yield() waiting for a given time to be up. This releases some resource while still keeping accurate time.
As to multiple threads in a game, I’ve tried it many times for lots of decent reasons (at least I thought so at the time). Its just more hassle than its worth. I just use a Pollable interface these days and make each component implement it. This is obivously not to say that I think Threads are bad in the general case.
Kev