java sleep和wait有区别么 java sleep() 和 wait() 有什么区别

java sleep\u548cwait\u6709\u533a\u522b\u4e48

\u9996\u5148\uff0c\u8981\u8bb0\u4f4f\u8fd9\u4e2a\u5dee\u522b\uff0c\u201csleep\u662fThread\u7c7b\u7684\u65b9\u6cd5,wait\u662fObject\u7c7b\u4e2d\u5b9a\u4e49\u7684\u65b9\u6cd5\u201d\u3002\u5c3d\u7ba1\u8fd9\u4e24\u4e2a\u65b9\u6cd5\u90fd\u4f1a\u5f71\u54cd\u7ebf\u7a0b\u7684\u6267\u884c\u884c\u4e3a\uff0c\u4f46\u662f\u672c\u8d28\u4e0a\u662f\u6709\u533a\u522b\u7684\u3002Thread.sleep\u4e0d\u4f1a\u5bfc\u81f4\u9501\u884c\u4e3a\u7684\u6539\u53d8\uff0c\u5982\u679c\u5f53\u524d\u7ebf\u7a0b\u662f\u62e5\u6709\u9501\u7684\uff0c\u90a3\u4e48Thread.sleep\u4e0d\u4f1a\u8ba9\u7ebf\u7a0b\u91ca\u653e\u9501\u3002\u5982\u679c\u80fd\u591f\u5e2e\u52a9\u4f60\u8bb0\u5fc6\u7684\u8bdd\uff0c\u53ef\u4ee5\u7b80\u5355\u8ba4\u4e3a\u548c\u9501\u76f8\u5173\u7684\u65b9\u6cd5\u90fd\u5b9a\u4e49\u5728Object\u7c7b\u4e2d\uff0c\u56e0\u6b64\u8c03\u7528Thread.sleep\u662f\u4e0d\u4f1a\u5f71\u54cd\u9501\u7684\u76f8\u5173\u884c\u4e3a\u3002Thread.sleep\u548cObject.wait\u90fd\u4f1a\u6682\u505c\u5f53\u524d\u7684\u7ebf\u7a0b\uff0c\u5bf9\u4e8eCPU\u8d44\u6e90\u6765\u8bf4\uff0c\u4e0d\u7ba1\u662f\u54ea\u79cd\u65b9\u5f0f\u6682\u505c\u7684\u7ebf\u7a0b\uff0c\u90fd\u8868\u793a\u5b83\u6682\u65f6\u4e0d\u518d\u9700\u8981CPU\u7684\u6267\u884c\u65f6\u95f4\u3002OS\u4f1a\u5c06\u6267\u884c\u65f6\u95f4\u5206\u914d\u7ed9\u5176\u5b83\u7ebf\u7a0b\u3002\u533a\u522b\u662f\uff0c\u8c03\u7528wait\u540e\uff0c\u9700\u8981\u522b\u7684\u7ebf\u7a0b\u6267\u884cnotify/notifyAll\u624d\u80fd\u591f\u91cd\u65b0\u83b7\u5f97CPU\u6267\u884c\u65f6\u95f4\u3002\u7ebf\u7a0b\u7684\u72b6\u6001\u53c2\u8003Thread.State\u7684\u5b9a\u4e49\u3002\u65b0\u521b\u5efa\u7684\u4f46\u662f\u6ca1\u6709\u6267\u884c\uff08\u8fd8\u6ca1\u6709\u8c03\u7528start())\u7684\u7ebf\u7a0b\u5904\u4e8e\u201c\u5c31\u7eea\u201d\uff0c\u6216\u8005\u8bf4Thread.State.NEW\u72b6\u6001\u3002Thread.State.BLOCKED\uff08\u963b\u585e\uff09\u8868\u793a\u7ebf\u7a0b\u6b63\u5728\u83b7\u53d6\u9501\u65f6\uff0c\u56e0\u4e3a\u9501\u4e0d\u80fd\u83b7\u53d6\u5230\u800c\u88ab\u8feb\u6682\u505c\u6267\u884c\u4e0b\u9762\u7684\u6307\u4ee4\uff0c\u4e00\u76f4\u7b49\u5230\u8fd9\u4e2a\u9501\u88ab\u522b\u7684\u7ebf\u7a0b\u91ca\u653e\u3002BLOCKED\u72b6\u6001\u4e0b\u7ebf\u7a0b\uff0cOS\u8c03\u5ea6\u673a\u5236\u9700\u8981\u51b3\u5b9a\u4e0b\u4e00\u4e2a\u80fd\u591f\u83b7\u53d6\u9501\u7684\u7ebf\u7a0b\u662f\u54ea\u4e2a\uff0c\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u5c31\u662f\u4ea7\u751f\u9501\u7684\u4e89\u7528\uff0c\u65e0\u8bba\u5982\u4f55\u8fd9\u90fd\u662f\u5f88\u8017\u65f6\u7684\u64cd\u4f5c\u3002

sleep\u548cwait\u7684\u533a\u522b\uff1a
1\u3001sleep\u7684\u610f\u601d\u662f\uff1a\u7761\uff0c\u7761\u89c9\uff0c\u7761\u7720\u3002
2\u3001wait\u7684\u610f\u601d\u662f\uff1a\u7b49\u5019\uff0c\u63a8\u8fdf\uff0c\u5ef6\u7f13\u7b49\u5f85\uff0c\u803d\u6401\uff0c\u4f3a\u5019\u7528\u9910\u3002
\u62d3\u5c55\u8d44\u6599
sleep\u7684\u7528\u6cd5
1\u3001They were exhausted from lack of sleep
\u7531\u4e8e\u7f3a\u4e4f\u7761\u7720\uff0c\u4ed6\u4eec\u975e\u5e38\u75b2\u60eb\u3002
2\u3001During the car journey, the baby slept
\u5750\u8f66\u6765\u7684\u8def\u4e0a\uff0c\u5b9d\u5b9d\u7761\u7740\u4e86\u3002
3\u3001I think he may be ready for a sleep soon.
\u6211\u60f3\u4ed6\u4e5f\u8bb8\u5f88\u5feb\u5c31\u8981\u7761\u4e00\u89c9\u4e86\u3002
4\u3001I can't get to sleep with all that singing.
\u90a3\u4e9b\u6b4c\u58f0\u6405\u5f97\u6211\u65e0\u6cd5\u5165\u7761\u3002
5\u3001I didn't lose too much sleep over that investigation.
\u6211\u5e76\u4e0d\u592a\u62c5\u5fc3\u90a3\u4e2a\u8c03\u67e5\u3002
wait
1\u3001I walk to a street corner and wait for the school bus
\u6211\u8d70\u5230\u8857\u89d2\u7b49\u6821\u8f66\u3002
2\u3001There'll be a car waiting for you
\u4f1a\u6709\u8f86\u6c7d\u8f66\u7b49\u4f60\u3002
3\u3001I want to talk to you, but it can wait
\u6211\u60f3\u548c\u4f60\u8c08\u8c08\uff0c\u4f46\u53ef\u4ee5\u665a\u70b9\u518d\u8bf4\u3002
4\u3001If you think this all sounds very exciting, just wait until you read the book
\u5982\u679c\u4f60\u89c9\u5f97\u6240\u6709\u8fd9\u4e9b\u542c\u8d77\u6765\u4ee4\u4eba\u5174\u594b\uff0c\u90a3\u5c31\u7b49\u7740\u53bb\u8bfb\u8fd9\u672c\u4e66\u5427\u3002
5\u3001'Wait a minute!' he broke in. 'This is not giving her a fair hearing!'
\u201c\u7b49\u4e00\u4e0b\uff0c\u201d\u4ed6\u63d2\u5634\u8bf4\uff0c\u201c\u8fd9\u6ca1\u6709\u7ed9\u5979\u4e00\u4e2a\u516c\u5e73\u7684\u89e3\u91ca\u673a\u4f1a\uff01\u201d

sleep()和wait()的区别

Java中的多线程是一种抢占式的机制而不是分时机制。线程主要有以下几种状态:可运行,运行,阻塞,死亡。抢占式机制指的是有多个线程处于可运行状态,但是只有一个线程在运行。
当有多个线程访问共享数据的时候,就需要对线程进行同步。线程中的几个主要方法的比较:
Thread类的方法:sleep(),yield()等
Object的方法:wait()和notify()等
每个对象都有一个机锁来控制同步访问。Synchronized关键字可以和对象的机锁交互,来实现线程的同步。
由于sleep()方法是Thread类的方法,因此它不能改变对象的机锁。所以当在一个Synchronized方法中调用sleep()时,线程虽然休眠了,但是对象的机锁没有被释放,其他线程仍然无法访问这个对象。而wait()方法则会在线程休眠的同时释放掉机锁,其他线程可以访问该对象。
Yield()方法是停止当前线程,让同等优先权的线程运行。如果没有同等优先权的线程,那么Yield()方法将不会起作用。
一个线程结束的标志是:run()方法结束。
一个机锁被释放的标志是:synchronized块或方法结束。
Wait()方法和notify()方法:当一个线程执行到wait()方法时(线程休眠且释放机锁),它就进入到一个和该对象相关的等待池中,同时失去了对象的机锁。当它被一个notify()方法唤醒时,等待池中的线程就被放到了锁池中。该线程从锁池中获得机锁,然后回到wait()前的中断现场。
join()方法使当前线程停下来等待,直至另一个调用join方法的线程终止。
值得注意的是:线程的在被激活后不一定马上就运行,而是进入到可运行线程的队列中。
共同点: 他们都是在多线程的环境下,都可以在程序的调用处阻塞指定的毫秒数,并返回。
不同点: Thread.sleep(long)可以不在synchronized的块下调用,而且使用Thread.sleep()不会丢失当前线程对任何对象的同步锁(monitor);
object.wait(long)必须在synchronized的块下来使用,调用了之后失去对object的monitor, 这样做的好处是它不影响其它的线程对object进行操作。
举个Java.util.Timer的例子来说明。

private void mainLoop() {
while (true) {
....
synchronized(queue) {
.....
if (!taskFired) // Task hasn't yet fired; wait
queue.wait(executionTime - currentTime);
}
}
在这里为什么要使用queue.wait(),而不是Thread.sleep(), 是因为暂时放弃queue的对象锁,可以让允许其它的线程执行一些同步操作。如:
private void sched(TimerTask task, long time, long period) {
synchronized(queue) {
...
queue.add(task);
}
}
但是正如上篇文章讲到的,使用queue.wait(long)的前提条件是sched()动作执行的时间很短,否则如果很长,那么queue.wait()不能够按时醒来。

(2)
前面讲了wait/notify机制,Thread还有一个sleep()静态方法,它也能使线程暂停一段时间。sleep与wait的不同点是:sleep并不释放锁,并且sleep的暂停和wait暂停是不一样的。obj.wait会使线程进入obj对象的等待集合中并等待唤醒。
但是wait()和sleep()都可以通过interrupt()方法打断线程的暂停状态,从而使线程立刻抛出InterruptedException。
如果线程A希望立即结束线程B,则可以对线程B对应的Thread实例调用interrupt方法。如果此刻线程B正在wait/sleep/join,则线程B会立刻抛出InterruptedException,在catch() {} 中直接return即可安全地结束线程。
需要注意的是,InterruptedException是线程自己从内部抛出的,并不是interrupt()方法抛出的。对某一线程调用interrupt()时,如果该线程正在执行普通的代码,那么该线程根本就不会抛出InterruptedException。但是,一旦该线程进入到wait()/sleep()/join()后,就会立刻抛出InterruptedException。

sleep()、suspend()、resume()方法不推荐使用,推荐使用wait()、notify()、notifyAll()。
sleep()方法是使线程停止一段时间的方法。在sleep 时间间隔期满后,线程不一定立即恢复执行。这是因为在那个时刻,其它线程可能正在运行而且没有被调度为放弃执行,除非
(a)“醒来”的线程具有更高的优先级。
(b)正在运行的线程因为其它原因而阻塞。
wait()是线程交互时,如果线程对一个同步对象x 发出一个wait()调用,该线程会暂停执行,被调对象进入等待状态,直到被唤醒或等待时间到。
当调用wait()后,线程会释放掉它所占有的“锁标志”,从而使线程所在对象中的其它synchronized数据可被别的线程使用。
waite()和notify()因为会对对象的“锁标志”进行操作,所以它们必须在synchronized函数或synchronized block中进行调用。如果在non-synchronized函数或non-synchronized block中进行调用,虽然能编译通过,但在运行时会发生IllegalMonitorStateException的异常。

扩展阅读:java入门网站 ... java await ... java servlet ... java python ... java windowbuilder ... java osgi ... javascript ... yee视频 ... java equals ...

本站交流只代表网友个人观点,与本站立场无关
欢迎反馈与建议,请联系电邮
2024© 车视网