Java线程等待中Thread.sleep()、Object.wait()、LockSupport.park、UNSAFE.park()的原理与区别

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JBEFH3mo

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();
	}
}

file

wait释放锁示例:

public class ObjeactWaitDemo {
   

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值