【发布时间】:2015-08-09 02:38:43
【问题描述】:
这些是一些概念上的疑问。
我在准备 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 上调用了 sleep() 5 秒,它正在对 obj1 做一些工作。 t1 在obj1 上仍有一些工作要做。 sleep() 不会释放对 obj1 的锁定。同时t2 正在尝试访问obj1。
但如果不能保证t1 会再次运行,那么t2 会一直等待下去吗?这种情况可以避免吗?
2) 如果t1 根据其任务对obj1 进行更改,并且在这期间我在t1 上调用wait()。 t2 介入并根据其工作对obj1 进行更改。
当t1 再次运行时,会一团糟,对吧?因为obj1 的状态将是t2 所做的任何事情,而t1 将丢失它在调用wait() 之前所做的所有工作。
3) wait() 是一种非静态方法,所以如果一个线程有另一个线程的引用,它会导致另一个线程等待吗?有没有例子可以理解这种应用?
4) 我还读到必须从同步上下文中调用 wait() 的内容,从同步上下文中调用 sleep() 是个坏主意。这两者的原因是什么?
【问题讨论】:
-
我认为您的问题已经得到解答:stackoverflow.com/questions/1036754/…
-
我已经看到了这个问题,它确实解决了我的一些疑问,但不是全部。
标签: java multithreading sleep wait