Thread.sleep(long)和object.wait(long)的共同点和不同点(zz)-
2012-08-13 11:54
357 查看
共同点: 他们都是在多线程的环境下,都可以在程序的调用处阻塞指定的毫秒数,并返回。
不同点: 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()不能够按时醒来。
不同点: 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()不能够按时醒来。
相关文章推荐
- Thread.sleep(long)和object.wait(long)的共同点和不同点(zz)-
- Thread.sleep(long)和object.wait(long)的共同点和不同点
- java之Thread.sleep(long)与object.wait()/object.wait(long)的区别(转)
- 【线程】java之Thread.sleep(long)与object.wait()/object.wait(long)的区别及相关概念梳理
- java之Thread.sleep(long)与object.wait()/object.wait(long)的区别
- wait()和notify(),notifyAll()是Object类的方法,sleep()和yield()是Thread类的方法
- Java中的Object的Wait() 和notify()方法使用时应注意的地方和Thread中的sleep()方法
- java object的wait和Thread的sleep方法区别
- 【Java之多线程(二)】(***重要***)Java多线程中常见方法的区别,如object.wait()和Thread.sleep()的区别等
- 有关Object之wait(),notify() 和notifyAll() 以及Thread之sleep(),join()和yield()
- java.lang.Thread.sleep()方法和java.lang.Object.wait()方法之间的区别
- java.lang.Thread.sleep()方法和java.lang.Object.wait()方法的区别--有道笔记整理
- Java中的Object的Wait() 和notify()方法使用时应注意的地方和Thread中的sleep()方法
- Java并发07:Thread的基本方法(4)-Thread.sleep()、Object.wait()、notify()和notifyAll()
- Object源码, monitor (wait pool) , Thread.sleep(), interrupt
- java object的wait和Thread的sleep方法区别
- Thread:sleep---wait的不同
- java object的wait和Thread的sleep方法区别
- Java中的Object的Wait() 和notify()方法使用时应注意的地方和Thread中的sleep()方法
- Java多线程Thread.yield(),thread.join(), Thread.sleep(200),Object.wait(),Object.notify(),Object.notifyAll()的区别