Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在线程的run()方法中调用wait()_Java - Fatal编程技术网

Java 在线程的run()方法中调用wait()

Java 在线程的run()方法中调用wait(),java,Java,我很好奇为什么这不起作用?我得到一个非法的监视器状态例外。这是已封装在线程中并已启动的Runnable的run方法 public void run() { while(true) { System.out.println("Hello World"); synchronized(Thread.currentThread()) { try{ wait();

我很好奇为什么这不起作用?我得到一个非法的监视器状态例外。这是已封装在线程中并已启动的Runnable的run方法

public void run()
{
    while(true)
    {
        System.out.println("Hello World"); 

        synchronized(Thread.currentThread())
        {
            try{
                wait();     
            }  
            catch (InterruptedException e){}
        }
    }
}
根据javadoc,针对:

调用wait()时,您正在可运行实例上调用它。由于同步块在当前线程上,而不是在
this
上,因此您不持有当前实例的锁。您应该将代码更改为
synchronized(this)
,以避免出现异常。

根据javadoc:

调用wait()时,您正在可运行实例上调用它。由于同步块在当前线程上,而不是在
this
上,因此您不持有当前实例的锁。您应该将代码更改为“已同步”(this),以避免出现异常。

您在拥有另一个对象(Thread.currentThread()。监视器(
synchronize
on)必须与调用
wait()
on的对象相同。因此,这不会导致错误:

public void run() {
    synchronized(this) {
        try {
            wait();
        } catch (InterruptedException e) { }
    }
}
您正在一个对象上调用
wait()
,同时拥有另一个对象的监视器(
Thread.currentThread()
)。监视器(
synchronize
on)必须与调用
wait()
on的对象相同。因此,这不会导致错误:

public void run() {
    synchronized(this) {
        try {
            wait();
        } catch (InterruptedException e) { }
    }
}

和都有关于这方面的有用信息。你读过这些吗?如果没有,请这样做。如果是这样的话,那么这里显示的信息会让您感到困惑吗?另外,请查看这篇关于Java线程和监视器的优秀文章:我在检查和修复它之前就意识到了这一点。我的错误。谢谢你的资源,我一定会看的!和都有关于这方面的有用信息。你读过这些吗?如果没有,请这样做。如果是这样的话,那么这里显示的信息会让您感到困惑吗?另外,请查看这篇关于Java线程和监视器的优秀文章:我在检查和修复它之前就意识到了这一点。我的错误。谢谢你的资源,我一定会看的!