У меня есть два условия, один внутри другого, с булевыми элементами для их управления. В принципе, один для прекращения обмена, а другой - для прослушивания соединения. Пользователь может выбрать, чтобы отключить общий доступ, и в этом случае сервер перестает слушать, но он не будет завершен. Если пользователь выбирает завершение, то оба логических значения равны false и цикл заканчивается.Почему это не переоценивается?
Это мой код:
public void run() {
while (!terminate) {
while (listening) {
try {
// accept connection -> create a new thread for each client
ClientServerShareInstance clientServerShareInstance = new ClientServerShareInstance(serverSocket.accept(), ui);
Thread clientServerThread = new Thread(clientServerShareInstance);
clientSockets.add(clientServerShareInstance);
connectedClients++;
clientServerThread.start();
} catch (IOException ex) {
}
}
}
}
public void closeAllClientConnections() {
for (Iterator it = clientSockets.iterator(); it.hasNext();) {
ClientServerShareInstance clientServerShareInstance = (ClientServerShareInstance) it.next();
clientServerShareInstance.closeAllConnections();
it.remove();
}
try {
this.serverSocket.close();
} catch (IOException ex) {}
this.setActive(false);
this.connectedClients = 0;
}
public void openConnection() {
try {
serverSocket = new ServerSocket(portNumber, 0, Inet4Address.getLocalHost());
setActive(true);
} catch (IOException ex) {}
}
}
closeAllClientConnections()
метод отключает долю (не прекращает его), и openConnection()
reenables которые разделяют.
Проблема заключается в том, что если я отключу общий ресурс, он должен просто закольтать terminate
, пока он не будет неопределенным, проверяя значение listening
. Когда я устанавливаю listening
в true
, он должен повторно ввести эту секунду во время цикла и начать прослушивание снова, потому что я открываю сокет сервера (хотя это не связано с этим, я просто говорю, что он должен быть инициализирован снова, потому что я закрываю это когда я отключу эту долю). Однако после отключения он никогда не арендует петлю listening
, даже когда вызывается openConnection()
.
Кто знает, что здесь не верно?
'SetActive (...) 'устанавливает значение' listen'? – Gray
Нет, они просто объявлены как обычные частные булевы внутри моего класса. Я не использовал volatile, потому что я думал, что объекты были разделены между несколькими потоками, и я не требовал блокировок, потому что это не сложная операция, когда несколько потоков «сражаются» за доступ в одно и то же время. – swiftcode
@Gray Да, делает. Это просто средство для этой переменной. – swiftcode