java面试高频问题——wait 和sleep 的区别

源码如下

public class Thread implements Runnable {
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);
	}
	//...
}
public class Object {
	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);
	}
	//...
}

1、sleep 来自Thread 类,和wait 来自Object 类。

2、最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。

3、wait,notify和notifyAll 只能在同步控制方法或者同步控制块里面使用,而sleep 可以在任何地方使用(使用范围)

4、sleep 必须捕获异常,而wait , notify 和notifyAll 不需要捕获异常

(1) sleep 方法属于Thread 类中方法,表示让一个线程进入睡眠状态,等待一定的时间之后,自动醒来进入到可运行状态,不会马上进入运行状态,因为线程调度机制恢复线程的运行也需要时间,一个线程对象调用了sleep方法之后,并不会释放他所持有的所有对象锁,所以也就不会影响其他进程对象的运行。但在sleep 的过程中过程中有可能被其他对象调用它的interrupt() ,产生InterruptedException 异常,如果你的程序不捕获这个异常,线程就会异常终止,进入TERMINATED 状态,如果你的程序捕获了这个异常,那么程序就会继续执行catch语句块(可能还有finally 语句块)以及以后的代码。
注意sleep() 方法是一个静态方法,也就是说他只对当前对象有效,通过t.sleep() 让t对象进入sleep ,这样
的做法是错误的,它只会是使当前线程被sleep 而不是t 线程

(2) wait 属于Object 的成员方法,一旦一个对象调用了wait方法,必须要采用notify() 和notifyAll() 方法
唤醒该进程;如果线程拥有某个或某些对象的同步锁,那么在调用了wait() 后,这个线程就会释放它持有的所有同步资源,而不限于这个被调用了wait() 方法的对象。wait() 方法也同样会在wait 的过程中有可能被其他对象调用interrupt() 方法而产生 。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值