0

チャット クライアントを作成しようとしています。javaSpace からメッセージを返しています。次に、newMessage = true を設定します。したがって、クライアントは、読む必要がある新しいメッセージがあることを確認できます。

public void notify(RemoteEvent ev) 
{
    try 
    {
        messageRead = false;
        QueueItem qiTemplate = new QueueItem();
        newMessage = (QueueItem)space.take(qiTemplate,null,Long.MAX_VALUE);
        System.out.println(newMessage.getSender().getName()+ ": " + newMessage.getContent());
    } 
    catch (Exception e) 
    {
        e.printStackTrace();
    }
}

次に、クライアントに対して、

while(true)
{
    try 
    {
        boolean temp  = _manager.messageRead;
        //System.out.println(temp);
        if(!temp)
        {
            QueueItem nextJob = _manager.newMessage;
            String nextJobNumber = nextJob.getSender().getName();
            String nextJobName = nextJob.getContent();
            System.out.println(nextJob.getSender().getName()+ ": " + nextJob.getContent());
            jobList.append( nextJobNumber + " : " + nextJobName + "\n" );

            _manager.messageRead = true;
        }



    }  catch ( Exception e) 
    {
        e.printStackTrace();
    }
}

あまりにも false に設定しただけでも、今は常に _messager.messageRead を true に返します。//System.out.println(temp); のコメントを外すと、ブール値は何らかの理由で更新され、その意味も等しくなります。

これまでこのエラーに遭遇したことはなく、非常に奇妙です。誰かが助けてくれることを願っています。

4

1 に答える 1

0

boolean flag への同期アクセスがないようですmessageReadprintlnたまたまあなたのためにそれをするので、あなたが観察するものです。

おそらく、フラグ volatile を宣言することで問題を解決できます。

private volatile boolean messageRead;

これにより、コードを同期する必要なく、あるスレッドで行った変更が別のスレッドから確実に表示されます。

于 2012-12-09T18:31:49.407 に答える