Я работаю над приложением клиент-сервер и хочу завершить работу сервера, когда через сокет получено сообщение об остановке. Код для моего сервера выглядит следующим образом
public class Server extends Thread {
private AtomicBoolean running = new AtomicBoolean(true);
public synchronized void setRunning(boolean value){
running.set(value);
}
public void run(){
while(running.get()){
try {
clientSocket = serverSocket.accept();
//doing stuff...
}catch (IOException e) {
logger.error("{} \n",e.getMessage());
}
}
Переменная Запуск установлен в другом классе, который обрабатывает мои сообщения. Функция написана следующим образом:
public synchronized void onReceive(Message message){
if(message.equals(stopMessage)){
server.setRunning(false);
for(Client c : clients)
c.shutdown();
server.shutdown();
}
}
Моя проблема в том, что, пока l oop на сервере выполняет еще одну итерацию, прежде чем установить для бегущей переменной значение false, и сервер пытается проверить сокет, даже если это так. null, так как клиент, подключенный к этому сокету, уже закрыт (клиент также является потоком). Я делаю что-то не так, но я не знаю, что. Любые идеи? Спасибо!