线程中的wait()和sleep()有什么区别?
我是否理解wait()-ing线程仍然处于运行模式并使用CPU周期,但sleep()-ing不消耗任何CPU周期正确?
为什么我们同时使用wait()和sleep()?
它们的实现在较低级别上有什么不同?
线程中的wait()和sleep()有什么区别?
我是否理解wait()-ing线程仍然处于运行模式并使用CPU周期,但sleep()-ing不消耗任何CPU周期正确?
为什么我们同时使用wait()和sleep()?
它们的实现在较低级别上有什么不同?
当前回答
这些方法用于不同的事情。
Thread.sleep(5000); // Wait until the time has passed.
Object.wait(); // Wait until some other thread tells me to wake up.
Thread.sleep(n)可以被中断,但是Object.wait()必须被通知。 可以指定等待的最大时间:Object.wait(5000),这样就可以使用wait,呃,睡眠,但这样你就不得不使用锁了。
这两种方法都不会在休眠/等待时使用cpu。
这些方法是使用本地代码实现的,使用类似的结构,但方式不同。
自己寻找:本机方法的源代码是否可用?文件/src/share/vm/prims/jvm.cpp是起点…
其他回答
来源:http://javaconceptoftheday.com/difference-between-wait-and-sleep-methods-in-java/
wait()方法。
1)调用wait()方法的线程释放它持有的锁。
2)在其他线程调用同一锁上的notify()或notifyAll()方法后,线程重新获得锁。
3) wait()方法必须在同步块内调用。
4) wait()方法总是在对象上被调用。
5)等待中的线程可以通过调用notify()或notifyAll()方法被其他线程唤醒。
6)要调用wait()方法,线程必须有对象锁。
睡眠()方法
1)调用sleep()方法的线程不释放它持有的锁。
2) sleep()方法可以在同步块内部或外部调用。
3) sleep()方法总是在线程上调用。
4)睡眠线程不能被其他线程唤醒。如果这样做,线程将抛出InterruptedException。
5)调用sleep()方法时,线程不需要有对象锁。
wait()必须被synchronized包围,当线程进入synchronized块或方法时,它意味着获得锁,所以它不阻塞,调用wait意味着释放锁,所以它退出synchronized然后阻塞,thread .sleep()导致当前线程在指定的时间内暂停执行。线程不会失去任何监视器的所有权
这里有很多答案,但我找不到任何一个提到的语义区别。
这与线程本身无关;这两种方法都是必需的,因为它们支持非常不同的用例。
sleep()让线程像以前一样进入睡眠状态,它只是打包上下文并在预定义的时间内停止执行。因此,为了在到期时间之前唤醒它,您需要知道Thread引用。这在多线程环境中并不常见。它主要用于时间同步(例如,在3.5秒内醒来)和/或硬编码的公平性(只睡一会儿,让其他线程工作)。
相反,wait()是一种线程(或消息)同步机制,它允许您通知没有存储引用(也没有关心)的线程。您可以将其视为一个发布-订阅模式(wait == subscribe and notify() == publish)。基本上,使用notify()你是在发送一条消息(甚至可能根本没有收到,通常情况下你并不关心)。
总而言之,通常使用sleep()进行时间同步,使用wait()进行多线程同步。
它们可以在底层操作系统中以同样的方式实现,也可以完全不实现(因为以前版本的Java没有真正的多线程;可能一些小的虚拟机也不这样做)。别忘了Java是在VM上运行的,所以你的代码会根据所运行的VM/OS/HW的不同而转换成不同的东西。
睡眠/中断和等待/通知之间的一个潜在的巨大区别是
在sleep()期间调用interrupt()总是抛出异常(例如InterruptedException),而 在wait()期间调用notify()不会。
在不需要的时候生成异常是低效的。如果线程之间的通信速率很高,那么如果一直调用interrupt,就会产生很多异常,这完全是浪费CPU。
Wait()和sleep()的区别?
thread . sleep () 一旦它的工作完成,它就会向所有人释放锁。直到它永远不会向任何人释放锁。
Sleep() take the key, its never release the key to anyone, when its work completed then only its release then only take the key waiting stage threads.
Object.wait () 当它进入等待阶段时,它将释放键,并根据参数等待一些秒。
例如:
你的右手拿着咖啡,你可以拿另一个同手的任何一个人,什么时候你会放下然后只拿另一个同类型的物体在这里。也。这是sleep() 你睡觉的时候你什么工作都没做,你只是在睡觉。这里也一样。
wait()。当你被放下,在等待的时候再拿一个,那就是等待
你在你的系统中播放电影或任何东西,就像播放器一样,你一次不能播放多个,对吧,就是在这里,当你关闭并选择另一个任何人的电影或歌曲时,这意味着等待