我知道这个主题有很多答案,我想我已经全部阅读过了。 大多数答案不包括他们使用的命名空间,并且编译他们建议的代码几乎是不可能的。
我正在使用VS 2015 Comunity和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()
。问题是为IllegalMonitorStateException
的每次调用生成msgList.NotifyAll()
,我忽略了这一点
由于只有一个线程通知,只有一个等待,因此没有同步问题 - 但例外情况令人担忧。
答案 0 :(得分:0)
如果当前线程不拥有该对象的监视器,则无法对对象调用notify()。 你应该把它放在synchronized块中。
synchronized(msgList) {
msgList.NotifyAll();
}