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