Having this wait declaration:
public final native void wait(long timeout) throws InterruptedException;
It could exit by InterruptedExceptio
This doesn't exactly answer the question, but it will probably solve your problem: Use higher level concurrency mechanisms. Wait/notify is usually more low-level than you'd want, for this reason among many others.
For example, if you were using BlockingQueue.poll(long, TimeUnit), you could check if the result is null to know if you timed out.