2016-09-29 7 views
0

このトピックに関する多くの回答があり、それらをすべて読んだと思います。 ほとんどの回答には、使用する名前空間は含まれておらず、提案するコードのコンパイルは事実上不可能です。ArrayListを使用したIllegalMonitorStateException NotifyAll()Wait()

私はXamarinでVS 2015 Comunityを使用しています。これは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です。
スレッドが1つしか通知せず、1つだけ待機するため、同期の問題はありませんが、例外は心配です。

+0

public static ArrayList msgList = new ArrayList(); –

答えて

0

現在のスレッドがそのオブジェクトのモニタを所有していない場合、notify()を呼び出すことはできません。 同期ブロックに入れる必要があります。

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

上記の名前空間を使用している単語 'synchronized'は認識されません。私はそれを許可するものを見つけることができませんでした。また、私は[MethodImpl(MethodImplOptions.Synchronized)]を関数名の上に試してみましたが、どちらでも違いはありません。 –

+0

これを試してください: synchronized(msgList){ ... } – R4ng3LII

+0

私はこれを試しました。私が言ったように、私はコンパイルエラーが発生します: "名前 '同期'は現在のコンテキストに存在しません"。 –

関連する問題