java.lang.Object.wait()は、JDK/JREの実装により、再開指示(notification)、割り込み(interruption)、または時間切れ(time-out)を待たずに解除(「spurious wakeups」)されることがあります。そのため、wait()はループ内で使用するようにプログラミングしてください。
参考
The Java(TM) Programming Language Third Edition, by Ken Arnold, James Gosling and David Holmes. Addison-Wesley,2000,ISBN 0-201-70433-1