创建对象时出现IllegalMonitorStateException

时间:2014-09-06 09:03:45

标签: java synchronization java-native-interface illegalmonitorstateexcep

当我尝试创建对象的实例时,我得到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(母语   方法)   Phoenix.client.ClientAPI.NativeInterface.NativeAPIEventListener.access $ 000(NativeAPIEventListener.java:12)   Phoenix.client.ClientAPI.NativeInterface.NativeAPIEventListener $ 1.run(NativeAPIEventListener.java:30)   java.lang.Thread.run(未知来源)

1 个答案:

答案 0 :(得分:1)

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

  

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

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

相关问题