睡眠(sleep())和等待(wait())之间的混淆

22 浏览
0 Comments

睡眠(sleep())和等待(wait())之间的混淆

这个问题已经有了答案:

Java中\"wait()\"和\"sleep()\"的区别

这是几个概念上的疑惑。

我在准备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.

假设我有线程t1t2以及一个对象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日
0
0 Comments

好的,我来尝试回答这个问题。

  1. 如果t1 永远不再运行,我会认为内核的线程调度程序已经出了问题。我不知道您从哪里得到了这个想法,认为它永远不会再次运行。

  2. 如果您有两个线程对一个对象进行更改,您需要确保它们表现正常。需要使用synchronized来确保只有一个线程在同一时间操作该对象。你的例子很奇怪,因为你似乎在暗示程序员不能决定代码的行为。

  3. 您不理解wait()notify()。搜索有关它们的问题,有很多。

  4. wait()需要在同步上下文中才能获得对象监视器。在同步上下文中使用sleep()只会为想要进入的其他线程创建不必要的阻塞。

0
0 Comments

Java中wait()和sleep()的区别:

  1. wait()在等待时释放对象锁,而sleep()在等待时不会释放锁。
  2. wait()通常是在条件下进行的,线程会等待直到条件成立,而sleep()只是将线程休眠。
  3. wait()只能在同步上下文中调用,而sleep()可以在非同步块中调用。详见为什么wait()和notify()需要从同步方法中调用。
  4. wait()在对象上调用,而sleep()在线程上调用。详见为什么wait()和notify()在Object类中而不是Thread类中定义。
  5. 等待线程可以通过调用notify()和notifyAll()方法唤醒,而休眠线程无法通过调用notify()方法唤醒。
0