Thread.sleep(long)和object.wait(long)的共同点和不同点(zz)- 收藏
共同点: 他们都是在多线程的环境下,都可以在程序的调用处阻塞指定的毫秒数,并返回。
不同点: 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()不能够按时醒来。
分享到:
相关推荐
- `sleep()`是`Thread`类的静态方法,而`wait()`是`Object`类的方法。 - `wait()`需要在持有对象锁的同步块或方法中调用,否则抛出`IllegalMonitorStateException`,而`sleep()`无此限制。 - `wait()`可以通过`...
`sleep`和`wait`的区别** - `sleep`:是`Thread`类的方法,可以使当前线程暂停指定的时间,期间线程会释放CPU资源但不释放锁资源。 - `wait`:是`Object`类的方法,用于线程之间的同步。调用此方法的线程会释放锁...
5. **线程的暂停:** 使用 `Thread.sleep()` 方法让线程暂停一段时间。 6. **线程之间的交互:** 通过 `wait()` 和 `notify()` 方法实现线程间的通信。 #### 九、文件管理和输入输出 Java 提供了丰富的 API 来处理...
4. **所属类的不同**:`sleep()`是`Thread`类的静态方法;`wait()`则是`Object`类的方法。 #### 二、JMM(Java内存模型) ##### 2.1 指令重排 为了提高程序执行效率,计算机可能在不影响单线程程序语义的前提下,...
- 不同点:Java接口只能包含抽象方法,而C++虚类可以有具体实现。 #### 50. Java中的异常处理机制的简单原理和应用 Java异常处理机制主要包括`try-catch-finally`结构,以及自定义异常类。 #### 51. 垃圾回收的...
抽象类更适用于有共同属性和行为的类的抽象,而接口更适用于定义行为标准。 ### 25. 抽象方法与修饰符 抽象方法不可以是静态、原生或同步的,因为它们不包含具体的实现,无法被静态调用、原生实现或同步控制。 ##...
### Java面试宝典知识点梳理 #### 一、基础概念与语法 **1. ".java"文件是否必须以.java为扩展名?** - **答案:** 不一定非得使用.java作为扩展名,但这是约定俗成的做法,易于识别并被开发工具支持。 - **解释:*...
- **共同点**:都是异常,需要妥善处理以避免程序崩溃。 #### 42. `Error`与`Exception`的区别 - **`Error`**:严重错误,程序无法处理,如`OutOfMemoryError`。 - **`Exception`**:可以通过程序捕获并处理的一般...