Итак, я думаю, что на это был дан ответ раньше, но я не мог найти вопрос, так что простите меня.Многопоточная передача данных через массив в 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;
}
}
}
}
}
Итак, как я могу добавить строк в массив, который обычно для чтения-записи доступны для всех моих потоков?
Просто спросите, нужно ли вам больше узнать о коде.
Первое: когда вы достигаете числа max_player, вы принимаете, что цикл становится очень быстрым пустым циклом. вероятно, не очень хорошо для выступлений. – njzk2
непонятно, в чем вопрос, и какова область действия каждого массива. – njzk2
Является ли параллелизм в массиве тем, о чем вы беспокоитесь? Если это так, подумайте о том, чтобы сделать его «изменчивым». См. Http://www.javamex.com/tutorials/synchronization_volatile.shtml. –