当前位置: 首页 > 知识库问答 >
问题:

使用Thread.Wait()时的Java IllegalMonitorStateException;

白志勇
2023-03-14

我刚开始使用线程,一调用wait方法就会得到一个IllegalMonitorStateException,有人能帮我吗

public class SomeClass{

    private final Thread thread = new Thread(this::someMethod);

    public synchronized void someMethod(){
        try {
            doSomething();
            TimeUnit.SECONDS.sleep(2);
            doSomething();
            thread.wait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        someMethod();
    }

    public synchronized void restartThread() {
        thread.notify();
    }
        SomeClass test = new SomeClass();
        test.start();

共有1个答案

白驰
2023-03-14

waitnotify方法只能在monitor对象上调用,您已经为该对象获得了锁。在您的示例中,您获得了对SomeClass类型对象的锁,但是您尝试在Thread对象的监视器上调用这些方法。相反,您应该在代码中调用wait();notify();,这将在这个对象上调用它们,该对象与您在方法上使用synchronized关键字获得锁的对象完全相同。

 类似资料:
  • 问题内容: 会打电话,但是谁以及什么时候通知(或)? 众所周知,线程连接将等待线程完成,但是谁调用它的通知呢? 问题答案: 编辑: 哦,您是在谈论对象本身的内部。在我们里面确实看到一个。就像是: 在这个由处理子系统。当方法结束时,被称为上对象。我不确定是否可以看到实际调用的代码- 似乎是在本机代码中完成的。 无需用户代码即可调用该对象。Java 代码在内部进行处理。线程完成后,调用将返回。 例如,

  • 我有两个应用程序:App1和App2 在App1中指定的权限如下所示 java.lang.SecurityException:权限拒绝:从PID=5550,UID=10919读取com.commonname.providers.app1 uri内容://com.commonname.providers.app1.read_login_token或ranturiPermission()(位于Andr

  • 有没有办法在使用 jongo 查询 MongoDB 时添加 ?我发现这样的错误 - '排序超出了 104857600 字节的内存限制,但没有选择加入外部排序。正在中止操作。传递 allowDiskUse:true 可以选择加入,可以通过以下方式阻止,您的聚合看起来像 但据我所知,Jongo 中的类仅将管道应用于自身,然后您可以使用 方法执行。 是否有任何方法可以将该参数传递给mongo而不从Jon

  • 问题内容: 我在Web应用程序中使用Jersey 2.13检索数据异步。在某些情况下,请求需要一段时间(即执行复杂报告时,即EE)才能将响应返回给客户端。 当客户端不等待异步响应(离开页面,关闭浏览器等)时,将抛出ClientAbortException。此行为是预期的,但它使堆栈跟踪淹没了我的日志文件,因为在响应返回之前被取消的每个单个异步请求都会打印堆栈跟踪。 堆栈跟踪如下所示: 我也正在使用

  • 我正在利用Java Mail API开发一个发送邮件的应用程序。如果我使用雅虎或gmail托管的邮件服务器,我可以成功地发送邮件。然而,当我尝试使用自己的邮件服务器时,我无法发送邮件,导致失败的可能原因是什么?当我在我的设备上执行我的应用程序时,它会显示“电子邮件未发送”,因此不会发生异常。我想问一下,如何更改程序,以便将我的应用程序成功连接到smtp服务器,或者如何获得更多信息以显示,从而了解连