gpt4 book ai didi

java - 创建对象时出现 IllegalMonitorStateException

转载 作者:太空宇宙 更新时间:2023-11-04 06:33:57 25 4
gpt4 key购买 nike

当我尝试创建对象的实例时,出现IllegalMonitorStateException。代码如下所示:

public int signIn(parameters...)
{
...check some stuff...
new Thread(... just a simple log here...).start();//IllegalMonitorStateException

return result;
}

更多信息:
实际应用程序由 2 个程序(C++ 和 java)组成,通过 JNI 进行交互。我遇到异常的情况如下。

  • c++ 程序要求 java 连接到服务器。 (这是一个非阻塞操作)
  • Java 程序通知 C++ 连接成功。 (在一个新线程中以便java可以继续执行其他任务)
  • 收到连接成功后,c++程序要求java登录
  • 发生异常。

我应该注意,此异常仅发生在这种特殊情况下,如果我在连接成功后的某个时间调用登录,则一切正常。

我尝试过的:

  • 一开始通知连接成功并不是在新线程中,而是创建线程并没有解决问题。
  • java 登录代码有一些同步内容,但删除它们并用简单的日志替换它仍然会产生问题。

编辑:
这是堆栈跟踪:

Phoenix.client.ClientAPI.NativeInterface.NativeAPIEventListener.onConnectingFinished(Native Method) Phoenix.client.ClientAPI.NativeInterface.NativeAPIEventListener.access$000(NativeAPIEventListener.java:12) Phoenix.client.ClientAPI.NativeInterface.NativeAPIEventListener$1.run(NativeAPIEventListener.java:30) java.lang.Thread.run(Unknown Source)

最佳答案

当 java 代码回调时,我在 C++ 代码中创建了一个新线程,这将 jthread:java -> c++ -> java 链分解为 jthread:java -> c++cthread:c++ -> java。这解决了我面临的问题。然而,我遇到了一个不同的问题,这导致我阅读了一些 JNI 文档。引用JNI doc :

The JNI interface pointer (JNIEnv) is valid only in the current thread. Should another thread need to access the Java VM, it must first call AttachCurrentThread() to attach itself to the VM and obtain a JNI interface pointer. Once attached to the VM, a native thread works just like an ordinary Java thread running inside a native method. The native thread remains attached to the VM until it calls DetachCurrentThread() to detach itself.

所以我想我应该在回调到java之前调用AttachCurrentThread。然而,这并不完全符合上面的描述,因为该线程不是 native 线程(它是最初在 java 代码中创建的线程,我可以在之后调用 DetachCurrentThread 吗?)。我没有测试这个解决方案,因为我也必须创建一个新线程,还有其他原因。但如果我有机会尝试一下,我会确认。

关于java - 创建对象时出现 IllegalMonitorStateException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25698620/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com