Вот фрагмент веб-сервера, который я сейчас создаю ...
// ...
threadPool = Executors.newCachedThreadPool();
while (true)
if(this.isOn) {
try { // listen for incoming connection
this.clientSocket = serverSocket.accept();
} catch (IOException e) {
System.err.println("LOG: >> Accept failed! ");
System.exit(1);
}
// as soon as a connection is established send the socket
// with a handler/processor to the thread pool for execution
threadPool.execute(new ClientRequestProcessor(clientSocket));
}
// ...
Обратите внимание, что переменная isOn является логическим значением VOLATILE.
Если я превращу if в какое-то время ... этот код работает ... но как таковой он не работает.Могу я спросить, почему?С логической точки зрения оба должны работать, даже если я проверяю этот флаг в if ... я что-то упустил?!
[Позднее редактирование:] Под неработающим я имею в виду ... браузер (например, firefox) не может подключиться, на самом деле он пытается, но время ожидания истекло.Опять же, если я изменю это, если (isOn) на некоторое время (isOn) это работает как шарм.
Любые предложения / идеи более чем приветствуются !!!
PS Мне нужна эта комбинация«while (true) if / while (test flag) {...}», потому что сервер можно запускать / останавливать из графического интерфейса ... поэтому необходим верхний уровень while (true), поэтому я могу перепроверить,Я включен (и, следовательно, прослушиваю соединения), или если я выключен (и меня не волнуют входящие соединения).Иглы, чтобы сказать, что обработчики событий GUI могут изменить флаг в любое время.