线程中的wait()和sleep()有什么区别?

我是否理解wait()-ing线程仍然处于运行模式并使用CPU周期,但sleep()-ing不消耗任何CPU周期正确?

为什么我们同时使用wait()和sleep()?

它们的实现在较低级别上有什么不同?


当前回答

在这里,我列出了wait()和sleep()方法之间的一些重要区别。 PS:也可以点击链接查看库代码(内部工作,只是为了更好地理解而玩一下)。

wait ()

Wait()方法释放锁。 wait()是Object类的方法。 wait()是非静态方法——public final void wait()会抛出InterruptedException{//…} wait()应该由notify()或notifyAll()方法通知。 Wait()方法需要从循环中调用,以处理假警报。 wait()方法必须从同步上下文(即同步方法或块)调用,否则将抛出IllegalMonitorStateException

睡眠()

Sleep()方法不释放锁。 sleep()是java.lang.Thread类的方法。 sleep()是静态方法——public static void sleep(long millis, int nanos)会抛出InterruptedException{//…} 在指定的时间量之后,sleep()将完成。 Sleep()最好不要从循环中调用(即。参见下面的代码)。 Sleep()可以从任何地方调用。没有具体的要求。

参考:等待和睡眠的区别

调用等待和睡眠方法的代码片段

synchronized(monitor){
    while(condition == true){ 
        monitor.wait()  //releases monitor lock
    }

    Thread.sleep(100); //puts current thread on Sleep    
}

其他回答

wait()和sleep()的区别

最根本的区别是wait()是Object的非静态方法,sleep()是Thread的静态方法。 主要的区别是wait()释放锁,而sleep()在等待时不释放任何锁。 Wait()用于线程间通信,而sleep()通常用于在执行时引入暂停。 wait()应该从synchronise内部调用,否则我们会得到一个IllegalMonitorStateException,而sleep()可以在任何地方调用。 要从wait()再次启动线程,必须无限期地调用notify()或notifyAll()。至于sleep(),线程肯定会在指定的时间间隔后启动。

相似之处

两者都使当前线程进入不可运行状态。 两者都是本机方法。

来源:http://www.jguru.com/faq/view.jsp?EID=47127

thread .sleep()将当前线程发送到“不可运行”状态 在一段时间内。线程保留它所获得的监视器 ——也就是说,如果线程当前在一个同步块或方法中,其他线程不能进入这个块或方法。如果另一个线程调用t.interrupt(),它将唤醒正在睡觉的线程。 注意,sleep是一个静态方法,这意味着它总是有影响 当前线程(正在执行sleep方法的线程)。一个 常见的错误是调用t.sleep(),其中t是另一个线程; 即使这样,当前线程也会休眠,而不是t线程。 T.suspend()已弃用。使用它可以暂停其他线程 而不是当前线程。挂起的线程保存其所有监视器和 因为这个状态是不可中断的,所以很容易死锁。 object.wait()将当前线程发送到“不可运行”状态, 类似于sleep(),但有一点不同。在对象上调用Wait,而不是 线程;我们称这个对象为“锁对象”。在lock.wait()之前 调用时,当前线程必须同步锁对象;wait () 然后释放这个锁,并将线程添加到“等待列表” 与锁关联。上的另一个线程可以同步 相同的锁对象并调用lock.notify()。这唤醒了原始的, 等待线程。基本上,wait()/notify()就像 Sleep ()/interrupt(),只有活动线程不需要直接 指向睡眠线程的指针,但仅指向共享锁对象。

这里有很多答案,但我找不到任何一个提到的语义区别。

这与线程本身无关;这两种方法都是必需的,因为它们支持非常不同的用例。

sleep()让线程像以前一样进入睡眠状态,它只是打包上下文并在预定义的时间内停止执行。因此,为了在到期时间之前唤醒它,您需要知道Thread引用。这在多线程环境中并不常见。它主要用于时间同步(例如,在3.5秒内醒来)和/或硬编码的公平性(只睡一会儿,让其他线程工作)。

相反,wait()是一种线程(或消息)同步机制,它允许您通知没有存储引用(也没有关心)的线程。您可以将其视为一个发布-订阅模式(wait == subscribe and notify() == publish)。基本上,使用notify()你是在发送一条消息(甚至可能根本没有收到,通常情况下你并不关心)。

总而言之,通常使用sleep()进行时间同步,使用wait()进行多线程同步。

它们可以在底层操作系统中以同样的方式实现,也可以完全不实现(因为以前版本的Java没有真正的多线程;可能一些小的虚拟机也不这样做)。别忘了Java是在VM上运行的,所以你的代码会根据所运行的VM/OS/HW的不同而转换成不同的东西。

在研究了wait和sleep之后,我总结了一些不同的关键注意事项,首先看一下使用wait()和sleep()的示例:

例1:使用wait()和sleep():

synchronized(HandObject) {
    while(isHandFree() == false) {
        /* Hand is still busy on happy coding or something else, please wait */
        HandObject.wait();
    }
}

/* Get lock ^^, It is my turn, take a cup beer now */
while (beerIsAvailable() == false) {
    /* Beer is still coming, not available, Hand still hold glass to get beer,
       don't release hand to perform other task */
    Thread.sleep(5000);
}

/* Enjoy my beer now ^^ */
drinkBeers();

/* I have drink enough, now hand can continue with other task: continue coding */
setHandFreeState(true);
synchronized(HandObject) {
    HandObject.notifyAll();
}

让我们明确一些关键的注意事项:

呼吁: wait():调用当前持有handdobject对象的线程 sleep():在线程上调用执行任务获取啤酒(是类方法,因此影响当前运行的线程) 同步: wait():当同步多线程访问同一对象(HandObject)时(当多个线程之间需要通信时(线程执行编码,线程执行获取啤酒)访问同一对象(HandObject) sleep():当等待状态继续执行时(等待啤酒可用) 持有锁: wait():释放锁,让其他对象有机会执行(HandObject是空闲的,你可以做其他工作) sleep():保持锁至少t次(或直到中断)(我的工作仍然没有完成,我继续持有锁,等待一些条件继续) 唤醒条件: wait():直到调用notify(), notifyAll()从对象 Sleep():直到至少超时或调用中断 最后一点是当estani表示:

通常使用sleep()进行时间同步,使用wait()进行时间同步 multi-thread-synchronization。

如果我说错了,请指正。

在这里,我列出了wait()和sleep()方法之间的一些重要区别。 PS:也可以点击链接查看库代码(内部工作,只是为了更好地理解而玩一下)。

wait ()

Wait()方法释放锁。 wait()是Object类的方法。 wait()是非静态方法——public final void wait()会抛出InterruptedException{//…} wait()应该由notify()或notifyAll()方法通知。 Wait()方法需要从循环中调用,以处理假警报。 wait()方法必须从同步上下文(即同步方法或块)调用,否则将抛出IllegalMonitorStateException

睡眠()

Sleep()方法不释放锁。 sleep()是java.lang.Thread类的方法。 sleep()是静态方法——public static void sleep(long millis, int nanos)会抛出InterruptedException{//…} 在指定的时间量之后,sleep()将完成。 Sleep()最好不要从循环中调用(即。参见下面的代码)。 Sleep()可以从任何地方调用。没有具体的要求。

参考:等待和睡眠的区别

调用等待和睡眠方法的代码片段

synchronized(monitor){
    while(condition == true){ 
        monitor.wait()  //releases monitor lock
    }

    Thread.sleep(100); //puts current thread on Sleep    
}