我试图理解java wait()和sleep()方法之间的以下区别。我理解每个人的基本内容,但经常与下面的陈述相混淆。
wait is called on Object while sleep is called on Thread.
上面语句中关于下面代码的对象是什么,因为即使是线程对象t也像java中的任何其他对象一样被创建。
public class MyRunnableThreadClass implements Runnable{
public void run(){
try{
Thread.sleep
}
catch(Exception e){}
}
public class ThreadDemo {
Thread t = new Thread ( new MyRunnableThreadClass());
}
在这种情况下,你能帮助哪些是对象和线程
答案 0 :(得分:1)
在线程上调用sleep时,在Object上调用wait。
声明甚至不正确。
wait()
是Object,
的非静态方法,因此必须使用特定实例进行调用。
sleep()
是Thread,
的静态方法,因此它不需要特定的实例,但它的作用是将当前线程置于休眠状态。它是通过静态调用Thread.sleep().
调用的。与任何特定对象完全无关。
答案 1 :(得分:0)
两种方法都使当前线程等待。因此,在这两种情况下,受影响的真实对象是当前线程。在obj.wait()的情况下,当在该对象上发出通知时将唤醒当前线程,因此obj可以被视为等待过程的附加参数。
但是如果将wait和sleep声明为Thread类的实例方法,则可以在任意线程上调用它们,从而干扰其他线程的执行。这导致弊大于利,因此通过更改调用语法并将显式线程引用 - thread.wait(obj)排除到obj.wait()和thread.sleep()到静态Thread.sleep()来禁止它。
答案 2 :(得分:0)
wait()
,因为它是Object
类的方法。它有助于同步对象。当我们发布监视器时,应该使用notify()
调用它。
Sleep是Thread类中的静态方法,它将当前Thread置于不可运行状态,从运行状态开始。
现在,在睡眠期之后,线程可以唤醒并且能够进入可运行状态。然后,调度程序可以将其调度为处于运行状态。