1

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

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

  return result;
}

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

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

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

我试过的:

  • 一开始通知连接成功不是在新线程中,但是创建线程并没有解决问题。
  • 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(未知来源)

4

1 回答 1

1

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

JNI 接口指针(JNIEnv)仅在当前线程中有效。如果另一个线程需要访问 Java VM,它必须首先调用 AttachCurrentThread() 将自己附加到 VM 并获取 JNI 接口指针。一旦连接到 VM,本机线程就像在本机方法中运行的普通 Java 线程一样工作。本机线程一直连接到 VM,直到它调用 DetachCurrentThread() 来分离自己。

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

于 2014-09-07T15:57:34.010 回答