首页 > 解决方案 > 如何编写基于事件的单线程程序?

问题描述

我对线程的了解非常有限。我碰巧是一个可以编写多线程程序的人,但只是通过复制粘贴并在互联网上找到我的问题的答案。但我最终决定学习一点并发,买了《Java Concurrency in Practice》一书。读了几页之后,我相信我会从这本书中学到很多东西。

也许我有点不耐烦,但我无法抗拒问这个问题的诱惑。它让我在 Stack Overflow 上创建了一个帐户。我不确定我能否正确地表达这个问题,所以我会尝试用一个例子来解释我的问题。

如果我必须用 Java 等语言编写一个(编码极不专业的)点对点聊天客户端,我将在客户端之间启动一个套接字连接并使其保持活动状态,因为消息可以随时到达。我可以想象的解决方案是在一个新线程中打开一个套接字连接并连续运行一个while循环以保持线程处于活动状态,因为线程一run返回就死了。出于某种原因,我无法在单线程程序中想象类似的聊天客户端。如果你只有一个线程,你怎么能一直“等待”直到消息到达。这不会阻止整个程序的执行吗?

要解决这样的问题,连续while循环的替代方案是什么?

标签: javamultithreadingconcurrency

解决方案


如果你只有一个线程,你怎么能一直“等待”直到消息到达。

一种可能性是让“并行”发生在您的应用程序“外部”。想象一下餐厅里的服务员。只有一个人。他从一位顾客走到另一位顾客,然后写下订单。不时地,他走到柜台前,点菜,拿起厨师留给他的任何东西。只有一个人,四处走动,做“单一任务”的工作。但最终,整个系统仍然有多个参与者(客人、服务员、厨师、酒吧外准备饮料的人)。因此,服务员可以被视为“单线程”,但最终,整个系统“餐厅”并非如此。

一些 IT 架构“模仿”了这一点,例如围绕“非阻塞”IO 的概念。这就是 node.js 的工作方式。它本质上是单线程的,但执行异步 IO(有关详细信息,请参见此处)。你也可以用 Java 做类似的事情。

另一方面,当您学习并发时,您仍然想了解“真正的”多线程,它意味着什么,以及如何编写代码来“使用”该概念。


推荐阅读