【发布时间】:2019-07-15 03:13:01
【问题描述】:
我对线程的了解非常有限。我碰巧是一个可以编写多线程程序的人,但只是通过复制粘贴并在互联网上找到我的问题的答案。但我最终决定学习一点并发,买了《Java Concurrency in Practice》一书。阅读几页后,我相信我会从这本书中学到很多东西。
也许我有点不耐烦,但我无法抗拒提出这个问题的诱惑。它让我在 Stack Overflow 上创建了一个帐户。我不确定我能否正确表达问题,所以我会尝试用一个例子来解释我的问题。
如果我必须用 Java 等语言编写一个(编码极不专业的)点对点聊天客户端,我将在客户端之间启动一个套接字连接并使其保持活动状态,因为消息可以随时到达。我可以想象的解决方案是在一个新线程中打开一个套接字连接并连续运行一个while循环以保持线程处于活动状态,因为一旦run返回,线程就会死亡。出于某种原因,我无法在单线程程序中想象类似的聊天客户端。如果你只有一个线程,你怎么能一直“等待”直到消息到达。这不会阻止整个程序的执行吗?
要解决这样的问题,有什么替代连续的while 循环的方法?
【问题讨论】:
-
如果您的聊天应用程序的工作方式是一侧始终是发送者,另一侧始终是接收者,那么在一定程度上,可以使用单线程来实现这一点。否则,您将始终有一个专用线程来完成连接工作(或者 API 会为您完成)。
-
简而言之:是的。在
Socket的输入流块上调用read。这就是为什么这通常使用专用线程来完成。您可以使用available()来检查数据是否存在,以免一直调用read,但通常您需要一个线程或像 Mina 这样的库来处理这个问题。 -
有异步网络之类的东西。没有线程需要等待 I/O 操作结束。相反,一旦操作完成,任务(类型为`Runnable`)就会准备好执行。它处理事件,并可以启动另一个 I/O 操作。
-
虽然我理解这个问题,但编写线程来处理你的聊天客户端可能比单线程容易得多。继续四处寻找对您有意义的好线程教程。您不需要任何真正花哨的东西,因此基本教程应该会有所帮助。祝你好运!
-
目前我真的不需要编写聊天客户端。自从线程被介绍给我以来,我就一直在想这个问题。我正在阅读 Java Concurrency in Practice 一书,到目前为止一切似乎都很简单。无论如何,我很感激你的建议。感谢大家抽出宝贵的时间发布您宝贵的 cmets 和答案。
标签: java multithreading concurrency