2016-10-25 6 views
0

Как я могу выйти из цикла while?Как остановить сервер в многопоточном приложении клиент/сервер?

Переменная «running» установлена ​​по умолчанию TRUE, и, получив «shutdown», значение должно быть изменено на FALSE и выйти из Thread (run-method). Таким образом, сервер закрывается после цикла while.

ExecutorService executor = Executors.newFixedThreadPool(3); 
     while (running) { 
      Socket socket = server.accept(); 
      executor.execute(new Handler(socket,server)); 
     } 
     executor.shutdown(); 
     server.close(); 

Прогон-метод:

while(Server.getRunning()){ 
      System.out.println("..Wait for Input!"); 

      String inline = input.readLine(); 
      String[] a = inline.split(" "); 

      int result; 

      if (a[0].equals("shutdown")){ 
       Server.setRunning(false); 
       Protocol.status(client, "shutdown"); 
       return; 
      } 
} 
+0

Просьба представить раздел, где вы определяете и управляющая переменная 'running' –

+0

Также обратите внимание на следующее:' Socket accept() ': ' Прослушивает подключение к этому сокету и acce это он. Метод блокируется до тех пор, пока не будет создано соединение. ' –

+0

running - это глобальная статическая переменная в моем Server.class и для управления переменной я использую метод getter/setter. когда клиент поставляет «shutdown», клиент закрывается нормально, но сервер реагирует только при подключении нового клиента из-за server.accept() в while-loop – SteveOhio

ответ

0

Я хотел бы предложить вам обернуть петлю примерки улова SocketException и реализовать что-то вроде этого:

public synchronized void shutdown() 
{ 
    this.running = false; 
    this.server.close(); 
} 
+0

спасибо. я попробовал это с помощью этого метода, но этот путь слишком радикален. Я просто хочу вернуться из метода run в мой while-loop. там я хочу закрыть исполнителя и закрыть сервер тоже – SteveOhio

+0

Я не знаю о каком-либо другом правильном способе прервать метод accept() ', который блокирует ваш цикл. –