Windows 2000 should multitask just as well as XP -- XP is pretty much the same OS, with a prettier face. Does the W2000 machine perhaps not have enough memory to swap your applications in and out efficiently?
Presumably it's not fine grained enough. Maybe you don't want to force your thread to always wait 1 second between iterations of a loop, but you don't mind if it does because other threads are busy.
I like to think yield() should be along the lines of "sleepUntilMyNextSliceIfThereAreThreadsInReadyState". If the rest of the threads are all sleeping or pending, then yield() should more-or-less do nothing.