【发布时间】:2014-02-04 18:54:59
【问题描述】:
即使在阅读http://krondo.com/?p=1209 或Does an asynchronous call always create/call a new thread? 之后,我仍然对如何在固有的单线程系统上提供异步调用感到困惑。我将解释我到目前为止的理解并指出我的疑问。
我读到的一个例子是描述一个 TCP 服务器提供异步处理请求 - 用户会调用一个方法,例如get(Callback c) 并且稍后会调用回调。现在,我在这里的第一个问题 - 我们已经有两个系统,一个服务器和一个客户端。这不是我的意思,因为事实上我们至少有两个线程——一个在服务器端,一个在客户端。
我读到的另一个例子是 JavaScript,因为这是 Node.js 的单线程异步系统最突出的例子。我无法理解的是,也许用 Java 术语思考的是:如果我执行下面的代码(为不正确的,可能是残暴的语法道歉):
function foo(){
read_file(FIle location, Callback c) //asynchronous call, does not block
//do many things more here, potentially for hours
}
读取文件的调用执行(某事)并返回,允许我的函数的其余部分执行。由于只有一个线程,即执行我的函数的线程,那么究竟同一个线程(也是唯一一个正在执行我的东西的线程)将如何从磁盘读取字节?
基本上,在我看来,我缺少一些类似于某种循环调度程序的底层机制,它本质上是单线程的,可能会将任务拆分为更小的任务或调用会产生的多线程组件一个线程并读取文件。
提前感谢所有 cmets 并在途中指出我的错误。
更新:感谢所有回复。帮助我解决此问题的其他良好资源如下:
- http://www.html5rocks.com/en/tutorials/async/deferred/
- http://lostechies.com/johnteague/2012/11/30/node-js-must-know-concepts-asynchrounous/
- http://www.interact-sw.co.uk/iangblog/2004/09/23/threadless (.NET)
- http://ejohn.org/blog/how-javascript-timers-work/(定时器的内部函数)
- http://www.mobl-lang.org/283/reducing-the-pain-synchronous-asynchronous-programming/
【问题讨论】:
-
可能有也可能没有后台线程由挂起的操作隐式启动,但它完全不透明,与启动操作本身的 JavaScript 代码无关。 Web 浏览器(或 NodeJS、FTM)中 JavaScript 线程的核心事件循环是单线程的。
标签: java javascript multithreading asynchronous single-threaded