【发布时间】:2011-06-03 21:32:09
【问题描述】:
这是我目前正在构建的网络服务器的 sn-p...
// ...
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)无法连接,实际上它一直在尝试但最终超时。同样,如果我将 if(isOn) 更改为 while(isOn) 它就像一个魅力。
欢迎提出任何建议/想法!!!
附:我需要这个组合“while(true) if/while(test flag) {...}”,因为服务器可以从 GUI 启动/停止...所以顶层 while(true) 是需要的,所以我可以重新检查我是打开(并因此监听连接)还是关闭(并且并不真正关心传入连接)。不用说GUI的事件处理程序可以随时修改标志。
【问题讨论】:
标签: java multithreading loops volatile conditional