Общий счетчик не увеличивается, как ожидается на параллельном сервере - PullRequest
1 голос
/ 14 декабря 2011

Я пытаюсь сохранить количество раз, когда любой клиент запрашивает описание у класса ServerProtocol.

В настоящее время счетчик будет увеличиваться с нуля каждый раз, когда присоединяется новый клиент. Есть идеи?

Счетчик класса:

public class Counter {

private int counter;

public synchronized int get() {
    return counter;
}

public synchronized void set(int n) {
    counter = n;
}

public synchronized void increment() {
    set(get() + 1);
}
}

Фрагмент из класса ServerProtocol:

 case OPTIONS:
            if (theInput.equals("1")) {
                theOutput = "computer program description here  -- Another? Y or N";
                counter.increment();
                System.out.println(counter.get());
                state = ANOTHER;

Приведенный выше метод println выводит текущее значение счетчика на терминал в классе сервера:

Класс ServerProtocol:

public class ServerProtocol {

private static final int TERMS = 0;
private static final int ACCEPTTERMS = 1;
private static final int ANOTHER = 2;
private static final int OPTIONS = 3;
private int state = TERMS;

public String processInput(String theInput) {
    String theOutput = null;

    Counter counter = new Counter();

    switch (state) {
        case TERMS:
            theOutput = "Terms of reference.  Do you accept? Y or N";
            state = ACCEPTTERMS;
            break;
        case ACCEPTTERMS:
            if (theInput.equalsIgnoreCase("y")) {
                theOutput = "1. computer program 2. picture 3. e-book";
                state = OPTIONS;
            } else if (theInput.equalsIgnoreCase("n")) {
                theOutput = "Bye.";
            } else {
                theOutput = "Invalid Entry -- Terms of reference.  Do you accept? Y or N";
                state = ACCEPTTERMS;
            }
            break;
        case ANOTHER:
            if (theInput.equalsIgnoreCase("y")) {
                theOutput = "1. computer program 2. picture 3. e-book";
                state = OPTIONS;
            } else if (theInput.equalsIgnoreCase("n")) {
                theOutput = "Bye.";
            } else {
                theOutput = "Invalid Entry -- Another? Y or N";
                state = ACCEPTTERMS;
            }
            break;
        case OPTIONS:
            if (theInput.equals("1")) {
                theOutput = "computer program description here  -- Another? Y or N";
                counter.increment();
                counter.get();
                state = ANOTHER;

            } else if (theInput.equals("2")) {
                theOutput = "picture description here -- Another? Y or N";
                state = ANOTHER;

            } else if (theInput.equals("3")) {
                theOutput = "e-book description here -- Another? Y or N";
                state = ANOTHER;

            } else {
                theOutput = "Invalid Entry -- 1. computer program 2. picture 3. e-book";
                state = OPTIONS;
            }
            break;
        default:
            System.out.println("Oops");
    }

    return theOutput;
}
}

Ответы [ 4 ]

3 голосов
/ 14 декабря 2011

Экземпляр счетчика в вашем методе serverprotocol является локальной переменной.Поэтому каждый раз, когда вы вызываете метод processInput, создается новый экземпляр счетчика с нулевым значением.Вот причина.

2 голосов
/ 14 декабря 2011

Вы вызываете processInput более одного раза?

Счетчик не статичен; каждый раз, когда вы инициализируете его (например, Counter counter = new Counter()), значение счетчика будет повторно инициализировано до 0. Или сделайте его статическим, или убедитесь, что оно инициализируется только один раз.

1 голос
/ 14 декабря 2011

Вы не указали жизненный цикл ServerProtocol, поэтому я не знаю, создается ли он каждый раз, когда клиент вызывает сервер, например, сервлет в Google App Engine.переместить определение Counter counter из метода в класс.Так Counter counter становится членом класса.

PS.Создание counter статического в текущем коде будет работать, но это не круто с точки зрения дизайна.

0 голосов
/ 14 декабря 2011

Не уверен, получу ли я то, что вы просите, но если вы хотите, чтобы был только 1 счетчик, вы можете сделать это static.Это должно гарантировать, что есть только 1 копия, которая увеличивается.Помогает ли это?

Редактировать: вы можете прочитать о статических переменных здесь .

...