这些是一些概念上的怀疑。
我在准备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)我在sleep()
上呼叫了t1
5秒钟,这对obj1
做了一些工作。 t1
obj1
上还有一些待完成的工作要做。 sleep()
未释放obj1
上的锁定。同时t2
正在尝试访问obj1
。
但是,如果不能保证t1
将再次运行,那么t2
会永远等待的情况会出现吗?可以避免这种情况吗?
2)如果t1
根据其任务对obj1
进行了更改,请在wait()
之间致电t1
。 t2
根据其工作介入并对obj1
进行了更改。
当t1
再次运行时,它会变得一团糟,对吧?因为obj1
的状态将是t2
所做的任何事情,t1
会在wait()
被调用之前失去它所做的所有工作。
3)wait()
是一个非静态方法,如果一个线程有另一个线程的引用,那么一个线程是否会导致另一个线程等待?有没有例子可以理解这种应用?
4)此外,我还读到了必须从同步上下文中调用wait()
的内容,从同步上下文中调用sleep()
是个坏主意。这两个原因是什么原因?
答案 0 :(得分:1)
Java中等待和睡眠的区别:
答案 1 :(得分:1)
好吧,我打算回答这个问题。
如果t1
从不再次运行,我会说内核的线程调度程序已损坏。我不知道你在哪里知道它永远不会再次运行。
如果有两个线程对一个对象进行更改,则需要确保它们的行为正常。例如使用synchronized
确保一次只有一个线程操纵对象。你的例子很奇怪,因为你似乎暗示程序员不会决定代码会发生什么。
您不理解wait()
和notify()
。搜索关于他们的问题,有很多。
wait()
需要在同步上下文中才能获取对象监视器。同步上下文中的sleep()
只为想要输入的其他线程创建了一个不必要的块。