0

スレッドによって連続的に呼び出される関数のグローバル変数の値を更新できません

関数コードは次のとおりです。

public void readMessages()
{
    if (srv.getServiceStatus() == Service.ServiceStatus.STARTED) {
        try {
            InboundMessage msg = null;
            java.util.LinkedList<InboundMessage> list = new java.util.LinkedList<InboundMessage>();
            srv.readMessages(list, InboundMessage.MessageClasses.UNREAD);

            int checkArray = list.size();

            for (int i = 0; i < list.size(); i++) {
                msg = list.get(i);
                System.out.println("New incoming message from: " + msg.getOriginator() +" : \t" + msg.getText() + "\n");
                saveSMS(msg.getOriginator(),msg.getText());

                if (checkArray == 0) {
                    messageArray = new String [4];
                    for (int j = 0 ; j<4 ; j++) {
                        messageArray[j] = "";
                    }
                }                            

                if (noOfSms < 4) {
                    messageArray[noOfSms] = msg.getText();
                    noOfSms = noOfSms + 1;
                } 
                if (noOfSms == 3) {
                    Receiver r = new Receiver ();
                    r.Processing_ReceivedSMS(msg.getText(),msg,messageArray);
                }  
            }
        }
        catch(Exception e){
            e.printStackTrace();
        }
    }
}

ここでnoOfSmsはグローバル変数ですが、その値は変わりません。

readMessage が呼び出される関数は次のとおりです。

public void run(){
    while (true){
        readMessages();

        try {
            t.sleep(5000);
            user_status=2;
        } catch (InterruptedException e) {
            System.out.println("Thread Pause Exception");
        }
    }
}

その背後にある理由は何ですか、それに対して何をすべきですか?

4

1 に答える 1

0

スレッドからこのメソッドを呼び出すため、変数が更新されない理由が 2 つあります。

  1. readMessages() 内のコードは、変数が更新される前に例外をスローする可能性があります
  2. if ブロック内にあるため、変数が更新されない可能性があります。if 条件をパスできるように、初期値を確認します。
于 2018-11-28T12:17:31.847 に答える