当前位置: 首页 > 知识库问答 >
问题:

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

史弘致
2023-03-14

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

要解决这样的问题,除了连续的while循环,还有什么替代方法?

共有1个答案

仲孙绍元
2023-03-14

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

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

一些IT架构“模仿”了这一点,例如围绕“非阻塞”IO的思想。这就是Node.js的工作方式。它本质上是单线程的,但也有异步IO(详见此处)。您也可以用Java做类似的事情。

 类似资料:
  • 问题内容: 我编写了一个单一的Kafka使用者(使用Spring Kafka),该使用者从单个主题中读取内容,并且是使用者组的一部分。消耗完一条消息后,它将执行所有下游操作,并移至下一个消息偏移。我将其打包为WAR文件,并且我的部署管道将其推送到单个实例。使用部署管道,我可以将该工件部署到部署池中的多个实例。 但是,当我希望多个消费者作为基础架构的一部分时,我无法理解以下内容: 实际上,我可以在部

  • 我编写了一个Kafka消费者(使用Spring Kafka),它从单个主题读取并且是消费者组的一部分。一旦消息被消费,它将执行所有下游操作并继续下一个消息偏移量。我已将其打包为WAR文件,我的部署管道将其推送到单个实例。使用我的部署管道,我可能可以将此工件部署到我的部署池中的多个实例。 但是,当我希望多个消费者作为我的基础设施的一部分时,我无法理解以下内容- > 实际上,我可以在部署池中定义多个实

  • 我有一个程序,当你点击“开始”时移动鼠标光标 单击“开始”,我创建了一个新线程,光标开始移动。当我单击“暂停”时,即使变量设置为false,光标仍会移动。 我不明白为什么当我点击“暂停”时,鼠标会一直移动,即使移动设置为false。 有人能看出我哪里出了问题,或者是否有更好的方法来解决这个问题吗?

  • C++11的伟大标志之一是将并发整合到语言和库中。熟悉其他线程API(比如pthreads或者Windows threads)的开发者有时可能会对C++提供的斯巴达式(译者注:应该是简陋和严谨的意思)功能集感到惊讶,这是因为C++对于并发的大量支持是在编译器的约束层面。由此产生的语言保证意味着在C++的历史中,开发者首次通过标准库可以写出跨平台的多线程程序。这位构建表达库奠定了坚实的基础,并发标准

  • 问题内容: 我有一个在一个(主)线程中工作的Java代码。从主线程中,我产生了一个新线程,在其中进行服务器调用。服务器调用完成后,我在新线程中进行了一些工作,然后代码加入了主线程。 我正在使用Eclipse Jobs进行服务器调用。 我想知道,如何为此编写一个JUnit测试用例。 问题答案: 您可能需要重组代码,以便可以轻松对其进行测试。 我可以看到几个不同的测试区域: 线程管理代码:启动线程并可

  • 上周我更新了Kotlin 1.5,昨天看到谷歌打算让Jetpack成为设计UI的首选选项后,我想做一些测试。 问题是将我的项目更新为静态编程语言1.5,当尝试构建项目时,我得到以下错误: 静态编程语言1.5与Jetpack Compose不兼容吗?在谷歌搜索问题后,我找到了版本,其中提到了Jetpack Compose,但不是以“不兼容”的方式。 你对此有任何答案吗?我应该使用吗?在这种情况下,我