Thread.sleep()
源码如下:
public static native void sleep(long millis) throws InterruptedException;
public static void sleep(long millis, int nanos)
throws InterruptedException {
if (millis < 0) {
throw new IllegalArgumentException("timeout value is negative");
}
if (nanos < 0 || nanos > 999999) {
throw new IllegalArgumentException(
"nanosecond timeout value out of range");
}
if (nanos >= 500000 || (nanos != 0 && millis == 0)) {
millis++;
}
sleep(millis);
}
说明:
- Thread.sleep()必须指定休眠时间,所以线程状态为TIMED_WAITING。
- 如果休眠时发生中断,会抛出InterruptedException异常,并必须处理。
- 等待期间,不会释放所持有的锁
Object.wait()
源码如下:
public final native void wait(long timeout) throws InterruptedException;
public final void wait(long timeout, int nanos) throws InterruptedException {
if (timeout < 0) {
throw new IllegalArgumentException("timeout value is negative");
}
if (nanos < 0 || nanos > 999999) {
throw new IllegalArgumentException(
"nanosecond timeout value out of range");
}
if (nanos > 0) {
timeout++;
}
wait(timeout);
}
public final void wait() throws InterruptedException {
wait(0);
}
说明:
- 线程状态为WAITING表示一直等待,通过Object.notify()唤醒。
- 如果休眠时发生中断,会抛出InterruptedException异常,并必须处理。
- 等待期间,会释放所持有的锁
- 必须获取到对象锁时才可以进入等待状态,否则会抛出java.lang.IllegalMonitorStateException异常。
错误使用示例:
public static void main(String[] args) {
Object waitObject = new Object();
try {
//没获取到waitObject的锁,调用该方法抛出IllegalMonitorStateException异常
waitObject.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
wait释放锁示例:
public class ObjeactWaitDemo {
public