有没有一种方法可以立即打印从客户端接收到的消息,而不使用无限循环来检查输入流是否为空?因为我发现使用无限循环消耗了大量的系统资源,这使得程序运行起来非常慢。我们还必须在客户端执行相同的操作(无限循环),以便在屏幕上实时打印消息。我使用的是Java。
发布于 2011-12-01 10:48:23
你应该在一个单独的Thread中处理输入流--让它block等待输入。它在阻塞时不会使用任何资源。如果你在做这类事情时看到过多的资源使用,那你就做错了。
发布于 2011-12-01 10:45:23
我认为你可以把你的循环放在不同的线程中,让它休眠一段时间(也许半秒?)迭代之间。它仍然是一个无限循环,但它不会消耗几乎那么多的资源。
发布于 2011-12-01 10:54:03
有两种方法可以避免繁忙的循环/休眠。
read。这会阻塞线程,直到客户端发送一些数据,但这没有问题,因为它不会阻塞处理其他客户端的线程。在这两种方法中,第二种方法在总体资源使用方面是最有效的。(每客户端线程方法在线程堆栈上使用大量内存,在线程切换开销上使用CPU。)
重复调用(比方说) InputStream.available()来查看是否有任何输入的繁忙循环效率非常低。您可以通过使用Thread.sleep(...)调用减慢轮询速度来降低它们的效率,但这也会降低服务的响应性。例如,如果在每组轮询之间添加1秒的休眠,则每个客户端将看到的效果是,服务器通常会在处理每个请求之前延迟1秒。假设这些请求是击键,并且响应响应它们,那么最终的结果是一个可怕的滞后服务。
https://stackoverflow.com/questions/8335942
复制相似问题