睡眠(sleep())和等待(wait())之间的混淆
睡眠(sleep())和等待(wait())之间的混淆
这个问题已经有了答案:
这是几个概念上的疑惑。
我在准备SCJP考试时在一本书中读到了这个。
Just because a thread’s sleep() expires, and it wakes up, does not mean it will return to running. It simply goes back to the runnable state. So you can't rely on sleep() for an accurate timer.
假设我有线程t1
和t2
以及一个对象obj1
。
1)在t1
上对obj1
进行一些工作,还有一些工作要做。我在t1
上调用了sleep()
五秒钟。 sleep()
不会释放obj1
上的锁。同时,t2
正在尝试访问obj1
。
但是,无法保证t1
会再次运行,是否会出现t2
永远等待的情况?是否可以避免这种情况?
2) 如果t1
根据任务对obj1
进行更改,并且在我在t1
上调用wait()
之间发生变化。 t2
介入并根据其工作对obj1
进行更改。
当t1
再次运行时,它将是一场混乱,对吧?因为此时obj1
的状态将是t2
完成的任何操作,t1
将丢失wait()
调用之前完成的所有工作。
3) wait()
是一个非静态方法,所以一个线程是否可以使另一个线程等待,如果它有对其他线程的引用?有没有示例来了解这种应用程序?
4) 我也读到过,wait()
必须从同步的上下文中调用,而从同步的上下文中调用sleep()
是个坏主意。这两个操作的原因是什么?
admin 更改状态以发布 2023年5月22日
Java中wait()和sleep()的区别:
- wait()在等待时释放对象锁,而sleep()在等待时不会释放锁。
- wait()通常是在条件下进行的,线程会等待直到条件成立,而sleep()只是将线程休眠。
- wait()只能在同步上下文中调用,而sleep()可以在非同步块中调用。详见为什么wait()和notify()需要从同步方法中调用。
- wait()在对象上调用,而sleep()在线程上调用。详见为什么wait()和notify()在Object类中而不是Thread类中定义。
- 等待线程可以通过调用notify()和notifyAll()方法唤醒,而休眠线程无法通过调用notify()方法唤醒。