모든 클라이언트가 ServerProtocol 클래스의 설명을 요청하는 횟수를 저장하려고합니다.공유 서버가 동시 서버에서 예상대로 증가하지 않습니다.
현재 카운터는 새 클라이언트가 가입 할 때마다 0부터 증가합니다. 어떤 아이디어?
카운터 분류 : 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);
}
}
니펫
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;
}
}
클라이언트가 조인 할 때마다 processInput을 호출합니까? 당신은 그 방법을 부를 때마다 새로운 카운터를 만들고 있습니다. – Megacan
다른 대답 외에도 증가 시키면 얻을 수있는 여러 스레드가 동시에 증가하고 그 다음에는 점점 커질 수 있습니다. 모든 스레드는 동일한 카운터 값을 보게됩니다. AtomicInteger 및 해당 incrementAndGet 메서드 사용을 고려하십시오. –
@ Megacan 예, processInput은 매번 호출됩니다. 아래에 명시된 바와 같이 static 변수를 사용하면 작업을 수행하는 것처럼 보입니다. – newToJava