IllegalMonitorStateException with ArrayList NotifyAll() Wait
本文关键字:Wait NotifyAll with ArrayList IllegalMonitorStateException | 更新日期: 2023-09-27 18:09:30
我知道关于这个话题有很多答案,我想我已经全部读过了。大多数答案不包括他们使用的名称空间,并且编译他们建议的代码实际上是不可能的。
我正在使用VS 2015 community with Xamarin,这是一个Android项目。
我的命名空间:
using Android.Graphics;
using Android.Util;
using Java.Lang;
using Java.Util;
我代码:
public static int updateWait() // Called by a thread.
{
int value = 0;
try
{
while (msgList.IsEmpty)
{
msgList.Wait();
}
value = (int)msgList.Get(0);
msgList.Remove(0) ;
}
catch (Exception e)
{
Log.Debug("", "" + e);
}
return value;
}
public static void updateNotify() // called by a service
{
if (msgList.IsEmpty)
{
msgList.Add(1000);
}
try
{
msgList.NotifyAll();
}
catch ( Exception e)
{
Log.Debug("", "" + e);
}
}
上面的代码工作正确,因为来自活动的线程似乎被阻塞,直到服务调用updateNotify()
。问题是每次调用msgList.NotifyAll()
都会生成IllegalMonitorStateException
,我忽略了。
因为只有一个线程发出通知,只有一个线程等待,所以没有同步问题——但是异常令人担忧。
如果当前线程不拥有对象的监视器,则不能在对象上调用notify()。你应该把它放在同步块中。
synchronized(msgList) {
msgList.NotifyAll();
}
如果有人仍然感兴趣,请尝试:
lock(msgList) {
msgList.NotifyAll();
}