线程中的wait()和sleep()有什么区别?
我是否理解wait()-ing线程仍然处于运行模式并使用CPU周期,但sleep()-ing不消耗任何CPU周期正确?
为什么我们同时使用wait()和sleep()?
它们的实现在较低级别上有什么不同?
线程中的wait()和sleep()有什么区别?
我是否理解wait()-ing线程仍然处于运行模式并使用CPU周期,但sleep()-ing不消耗任何CPU周期正确?
为什么我们同时使用wait()和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(),只有活动线程不需要直接 指向睡眠线程的指针,但仅指向共享锁对象。
其他回答
等待和睡眠的方法非常不同:
睡眠无法“唤醒”, 而wait在等待期间有一种“唤醒”的方式,由另一个线程调用notify或notifyAll。
仔细想想,这些名字在这方面令人困惑;然而,sleep是一个标准名称,而wait就像Win API中的WaitForSingleObject或WaitForMultipleObjects。
一个尚未提及的关键区别是:
sleep()不会释放它在线程上持有的锁, 同步(锁){ thread . sleep (1000);// LOCK被持有 } Wait()释放它在对象上持有的锁。 同步(锁){ LOCK.wait ();// LOCK不被持有 }
等待会释放锁,而睡眠不会。处于等待状态的线程可以在调用notify或notifyAll时被唤醒。但是在睡眠的情况下,线程保持锁,并且只有在睡眠时间结束时才有资格。
在这里,我列出了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(),线程肯定会在指定的时间间隔后启动。
相似之处
两者都使当前线程进入不可运行状态。 两者都是本机方法。