2013-06-18 4 views
1

Итак, это то, что у меня есть. Это серверная программа, которая соединяется с несколькими клиентами с помощью потоков. На данный момент эта основная петля почти бесконечна. Скажите, что клиент отправил команду shutdown на ServerThread. Может ли этот ServerThread получить доступ к основному классу, выйти из цикла и дойти до конца программы?Нарушение цикла из другого класса

Я попытался превратить isRunning = false в ServerThread, но это не работает.

public class Server 
{ 
    public static boolean isRunning = true; 

    public static void main(String[] args) 
    { 
     // init stuff 

     try { 
      serverSocket = new ServerSocket(27647); 
     } catch (IOException e) { 
      println("Could not listen on port 27647"); 
     } 

     while(isRunning) 
     { 
      Socket clientSocket = null; 

      try{ 
       clientSocket = serverSocket.accept(); 
      } catch(IOException e) { 
       println("Could not connect to client"); 
      } 

      ServerThread serv = new ServerThread(clientSocket); 
      serv.start(); 
     } 

     try { 
      serverSocket.close(); 
     } catch (IOException e1) { } 
    } 
} 
+1

Показать код, где вы положили 'isRunning = false' в ServerThread – user93353

ответ

5

Вам нужно сделать isRunning летучий, и вы должны закрыть ServerSocket, чтобы разблокировать принимающую нить. Я предлагаю вам иметь такой метод, как

public void close() throws IOException { 
    isRunning = false; 
    serverSocket.close(); 
} 

Если вы вызываете это из любой нити, нить останавливается почти сразу.

+0

Как работают изменчивые переменные? Раньше я их не использовал. – cory2067

+0

volatile обеспечивает три вещи: 1) компилятор не будет оптимизировать чтение и запись. 2) ЦП не только получит доступ к своей собственной копии в кеше. 3) происходит до и после определения отношения. то есть любое обновление, которое вы сделаете до того, как волатильная запись будет видна, и прочитанное вами после того, как волатильное чтение увидит любую запись, которая была сделана до него. –

Смежные вопросы