首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于Java的聊天系统

基于Java的聊天系统
EN

Stack Overflow用户
提问于 2011-12-01 10:40:59
回答 6查看 223关注 0票数 1

有没有一种方法可以立即打印从客户端接收到的消息,而不使用无限循环来检查输入流是否为空?因为我发现使用无限循环消耗了大量的系统资源,这使得程序运行起来非常慢。我们还必须在客户端执行相同的操作(无限循环),以便在屏幕上实时打印消息。我使用的是Java。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-12-01 10:48:23

你应该在一个单独的Thread中处理输入流--让它block等待输入。它在阻塞时不会使用任何资源。如果你在做这类事情时看到过多的资源使用,那你就做错了。

票数 2
EN

Stack Overflow用户

发布于 2011-12-01 10:45:23

我认为你可以把你的循环放在不同的线程中,让它休眠一段时间(也许半秒?)迭代之间。它仍然是一个无限循环,但它不会消耗几乎那么多的资源。

票数 0
EN

Stack Overflow用户

发布于 2011-12-01 10:54:03

有两种方法可以避免繁忙的循环/休眠。

  • 为每个客户端连接使用一个线程,并简单地让每个线程调用read。这会阻塞线程,直到客户端发送一些数据,但这没有问题,因为它不会阻塞处理其他客户端的线程。
  • 使用Java NIO通道选择器。它们允许线程等待,直到一组通道(在本例中为套接字)中的一个通道具有要读取的数据。Oracle Java Tutorials中有一节是关于这一点的。

在这两种方法中,第二种方法在总体资源使用方面是最有效的。(每客户端线程方法在线程堆栈上使用大量内存,在线程切换开销上使用CPU。)

重复调用(比方说) InputStream.available()来查看是否有任何输入的繁忙循环效率非常低。您可以通过使用Thread.sleep(...)调用减慢轮询速度来降低它们的效率,但这也会降低服务的响应性。例如,如果在每组轮询之间添加1秒的休眠,则每个客户端将看到的效果是,服务器通常会在处理每个请求之前延迟1秒。假设这些请求是击键,并且响应响应它们,那么最终的结果是一个可怕的滞后服务。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8335942

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档