如何编写基于事件的单线程程序?

时间:2019-02-21 09:07:59

标签: java multithreading concurrency

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

也许我有点不耐烦,但我无法抗拒问这个问题的诱惑。它使我在Stack Overflow上创建了一个帐户。我不确定我是否能够正确表达问题,因此我将尝试通过一个示例来解释我的问题。

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

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

1 个答案:

答案 0 :(得分:1)

  

如果只有一个线程,如何保持“等待”状态直到消息到达。

一种可能性是使“并行”发生在应用程序的“外部”。想象一下一家餐厅的服务员。只是一个家伙。他从一个客户走到下一个客户,并撰写订单。他不时走到柜台,下订单,拿起厨师为他留下的任何东西。只有一个人走来走去,做“单项任务”。但是最后,整个系统仍然有多个参与者(来宾,服务员,厨师,酒吧外准备饮料的人)。因此,服务员可以看作是“单线程”,但最终,整个系统不是“餐馆”。

一些IT架构会“模仿”,例如围绕“非阻塞” IO的思想。这就是node.js的工作方式。它本质上是单线程的,但是具有异步IO(有关详细信息,请参见here)。而且,您也可以使用Java做类似的事情。

另一方面,当您了解并发时,您仍然想了解“真正的”多线程,它的含义以及如何编写代码以“使用”该概念。