如果要对未同步的对象调用wait(),则始终会收到IllegalMonitorStateException.
try {
// you need this to do the wait
synchronized (thread) {
thread.wait(10000);
}
} catch (InterruptedException e) {
System.err.println("interrupted.");
}
如果您正在等待线程完成,那么您可能正在尝试执行以下操作:
try {
thread.join(10000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
System.err.println("interrupted.");
}
不幸的是,你不知道线程是否正在运行,因为join不会返回它是否超时(抱怨).所以你需要在连接后测试thread.isAlive().
如果你问如何在线程超过10000毫秒时取消线程,那么正确的做法是使用thread.interrupt().这将导致任何sleep()或wait()方法抛出InterruptedException,它将在线程上设置中断标志.
要使用中断标志,您的线程应该执行以下操作:
while (!Thread.currentThread.isInterrupted()) {
// do it's thread stuff
}
此外,执行类似下面的操作始终是一个好的模式,因为一旦抛出InterruptedException,就会清除中断标志:
} catch (InterruptedException e) {
// set the interrupt flag again because InterruptedException clears it
Thread.currentThread.interrupt();
System.err.println("interrupted.");
}