2013-12-09 2 views
0

Итак, я думаю, что на это был дан ответ раньше, но я не мог найти вопрос, так что простите меня.Многопоточная передача данных через массив в Java

У меня довольно простая чат-клиент-серверная пара, из которых сервер многопоточен, чтобы одновременно подключалось несколько клиентов. Серверный код выглядит следующим образом ...

private void loop(int port) { 
     // Opens a port for connections. 
    ServerSocket serverSocket = null; 
    Socket clientSocket = new Socket(); 
    try { 
     serverSocket = new ServerSocket(port); 
     System.out.println("Server running in port " + port); 
    } catch (IOException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 

     // Listens for a connection 
    while (onlineState == true && serverSocket != null) { 
     if (cur_players < max_players) { 
      try { 

       clientSocket = serverSocket.accept(); 
       System.out.println(clientSocket.getInetAddress() + " has connected to the port " + clientSocket.getPort()); 
       cur_players++; 

       new Thread(new SocketThread(clientSocket, Chat.getOpenSeat())).start(); 

      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

    } 
} 

Вот то, что Chat.getOpenSeat() делает просмотр массива (булевы сиденья []) через для открытого места в массиве буфера чата (строковый буфер [] []) и возвращает целое число для пятна, а затем помечает его. Однако, когда я обращаюсь к массиву буфера из потоков, поток только находит сообщения, которые он добавил сам. Ниже приведен соответствующий код.

toClient = c.poll(bufferSocket);    // Retrieves the top-most message from the seat's sub-array, 
               // then bumps the remaining messages up in the sub-array. 

if (toClient != null) { 
    out.println(toClient);      // Sends the message through the Socket. 
    System.out.println("Message was sent."); 
    toClient = null; 
} 

Как ни странно, нити могут получить доступ к мест [] массив без каких-либо проблем, находя в настоящее время активные сиденья и правильно давать все соответствующие подмассивов свои сообщения. Вот и бит кода я использую, чтобы добавить новое сообщение в массив:

public void offer(String msg) { 

    for (int seat = 0; seat < Server.max_players; seat++) { 
     if (seats[seat] == true) { 
      for (int i = 0; i < 100; i++) { 
       if (msgBuffer[seat][i] == null) { 
        msgBuffer[seat][i] = msg; 
        System.out.println("Message: '" + msg + "' was buffered for the Seat " + seat + "."); 
        break; 
       } 
      } 
     } 
    } 

} 

Итак, как я могу добавить строк в массив, который обычно для чтения-записи доступны для всех моих потоков?

Просто спросите, нужно ли вам больше узнать о коде.

+0

Первое: когда вы достигаете числа max_player, вы принимаете, что цикл становится очень быстрым пустым циклом. вероятно, не очень хорошо для выступлений. – njzk2

+0

непонятно, в чем вопрос, и какова область действия каждого массива. – njzk2

+1

Является ли параллелизм в массиве тем, о чем вы беспокоитесь? Если это так, подумайте о том, чтобы сделать его «изменчивым». См. Http://www.javamex.com/tutorials/synchronization_volatile.shtml. –

ответ

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