带ArrayList的IllegalMonitorStateException NotifyAll()Wait()

时间:2016-09-29 08:41:38

标签: c# android xamarin wait

我知道这个主题有很多答案,我想我已经全部阅读过了。 大多数答案不包括他们使用的命名空间,并且编译他们建议的代码几乎是不可能的。

我正在使用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(),我忽略了这一点 由于只有一个线程通知,只有一个等待,因此没有同步问题 - 但例外情况令人担忧。

1 个答案:

答案 0 :(得分:0)

如果当前线程不拥有该对象的监视器,则无法对对象调用notify()。 你应该把它放在synchronized块中。

synchronized(msgList) {
  msgList.NotifyAll();
}