在 Object 上调用 wait,而在 Object 上调用睡眠



我试图理解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()); 
}

在这种情况下,您能否提供帮助,这是对象和线程

在 Object 上调用 wait,而在 Object 上调用睡眠。

这种说法甚至不正确。

  • wait() 是一种非静态Object,方法,因此必须使用特定实例进行调用。

  • sleep() 是一种静态的Thread,方法,因此它不需要特定的实例,但它的作用是将当前线程置于睡眠状态。它通过静态调用调用Thread.sleep().与任何特定对象无关。

这两种方法都使当前线程等待。因此,在这两种情况下,受影响的真实对象都是当前线程。在 obj.wait() 的情况下,当在该对象上发出通知时,当前线程将被唤醒,因此可以将 obj 视为等待过程的附加参数。

但是,如果等待和睡眠被声明为类 Thread 的实例方法,那么它们可以在任意线程上调用,从而干扰另一个线程的执行。这弊大于利,因此通过更改调用语法并排除显式线程引用来禁止它 - thread.wait(obj) 到 obj.wait() 和 thread.sleep() 到 static Thread.sleep()。

wait()在对象上调用,因为它是Object类的方法。它有助于对象的同步。当我们发布监视器时,应该用notify()调用它。

睡眠是 Thread 类中的静态方法,它将当前线程从运行状态置于不可运行状态。

现在,在睡眠期之后,线程可以唤醒并能够进入可运行状态。然后,调度程序可以将其调度为处于运行状态。

最新更新