java wait await_多线程基础之sleep()、wait()、await()的区别

1、来源不同

wait()方法来自Object类

public class Object {

private static native void registerNatives();

static {

registerNatives();

}

public final void wait() throws InterruptedException {

wait(0);

}

public final native void wait(long timeout) throws InterruptedException;

}

复制代码sleep来自Thread类

public

class Thread implements Runnable {

/* Make sure registerNatives is the first thing does. */

private static native void registerNatives();

static {

registerNatives();

}

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

}

复制代码

2、关于锁得释放

sleep()方法并不释放锁,只是会让出cpu

wait()方法会释放掉锁,让出系统资源;需要调用notify、notifyAll对其进行唤醒

3、异常捕获问题

sleep 需要捕获异常

wait、notify、notifyAll 不需要捕获异常

4、使用范围

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

5、与synchronized 一起使用

1)用 obj 的 wait 和 notify 函数前必须获取对象锁,即在 synchronized(obj){...}代码块中。

2)如果都在 synchronized 代码块中,wait(obj)函数可以释放锁,而 sleep 函数则不释放锁。

1136af8a0e2bcf28d2e341d4e5e15a69.png

6、wait和await

wai()是Object类提供的,一般与synchronized联合使用。调用wait之后会释放锁,导致线程等待。唤醒进程使用notify()或者notifyAll();await()是Condition类当中的,一般与Lock联合使用。

wait用法

synchronized(obj){

obj.wait();//消费方没东西了,等待

}

synchronize(obj){

obj.notify();//有东西了,唤醒 消费进程

}

复制代码

Lock则是由Lock控制锁,Condition来控制被阻塞线程

await用法

// 消费者

lock.lock();

condition.await();

lock.unlock();

//生产者

lock.lock();

condition.signal();

lock.unlock();

复制代码

参考文章

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值