有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

创建对象时发生java IllegalMonitorStateException

当我试图创建一个对象的实例时,我得到了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登录
  • 出现异常

我应该注意,这个异常只发生在这个特殊的场景中,如果我在连接成功后调用login,一切正常

我尝试过的:

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

编辑:
这是stacktrace:

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)


共 (1) 个答案

  1. # 1 楼答案

    在C++代码调用java时,我创建了一个新线程,它将^ {< CD1>}链分解成^ {CD2>}和^ {CD3>}。这解决了我面临的问题。然而,我遇到了另一个问题,导致我阅读了一些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。然而,这并不完全符合上述描述,因为该线程不是本机线程(它是最初用java代码创建的线程,我可以在之后调用DetachCurrentThread)。我没有测试这个解决方案,因为我必须创建一个新线程,还有其他原因。但如果我有机会尝试一下,我会确认的