Node.js使用NIO的非阻塞IO与java线程池模式。调度行为不明确

时间:2015-09-03 10:53:43

标签: java node.js asynchronous scheduled-tasks nio

请帮助我理解使用NIO的线程池模式的缺点。

我发现了这个问题:Java NIO non-blocking mode vs node.js asychronous operation但它没有回答NIO如何影响java中的调度行为。

我如何理解Node.js和java.IO:

Node.js 使用事件循环和非阻塞IO结合回调。这允许在IO调用未完成时处理其他任务,如下所示:

Event loop in node.js

使用旧的 java.IO 库和线程池模式,java线程被阻塞,直到IO操作完成。与此同时,线程无法处理其他任务并被禁止安排。

但是现在。 NIO怎么样?考虑我们有一个最多10个线程的线程池。 每个线程都以Runnable对象的形式获得一些工作。

如果需要长期的IO操作,会发生什么。在最初的IO调用完成之前,我无法相信当前未撤消的Runnable将被其他人取代。

那么与java.NIO相比,如何更改java.IO Java中的调度行为?

1 个答案:

答案 0 :(得分:3)

本质上,NIO提供了编写自己的单线程事件循环的方法,类似于node.js.相比之下,Java IO没有提供这样的手段。

实现可能有所不同,但实质上,您可以创建一个从Selector读取的线程,并为每个成功的选择执行一些注册的回调。然后,对于每种新类型的IO,您可以使用相同的Selector注册它的Channel(或任何东西),并以这种方式实现100%相同(但更灵活)的单线程回调事件循环实现。 NIO本身并不提供这样的事件循环或任何类似的东西,如果这就是你所要求的。

值得注意的是,NIO背后的实施因底层的基础设施而异。例如,在POSIX系统中使用NIO写入文件将转换为本机OS调用,而在运行它时,一些阻止IO-only-OS将使Java为每个IO创建一个单独的线程以实现向后兼容(因为在技术上不会有其他做NIO的方法。

我希望能回答你的问题,这有点模糊。