2016-09-29 63 views
0

我知道這個主題有很多答案,我想我已經讀了所有。 大多數答案不包括他們使用的命名空間,並且編譯他們認爲幾乎不可能的代碼。IllegalMonitorStateException與ArrayList NotifyAll()等待()

我正在使用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

public static ArrayList msgList = new ArrayList(); –

回答

0

如果當前線程不擁有該對象的監視器,則不能調用對象的notify()。 你應該把它放在同步塊中。

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

使用上面的命名空間不能識別單詞'synchronized'。我找不到允許它的人。此外,我已經嘗試[MethodImpl(MethodImplOptions.Synchronized)]上方的函數名稱,這也沒有任何區別。 –

+0

試試這個: synchronized(msgList){ ... } – R4ng3LII

+0

我試過這個。正如我所說的,我收到了一個編譯錯誤:「名稱'synchronized'在當前上下文中不存在」。 –

相關問題