请帮助我理解使用NIO的线程池模式的缺点。
我发现了这个问题:Java NIO non-blocking mode vs node.js asychronous operation但它没有回答NIO如何影响java中的调度行为。
我如何理解Node.js和java.IO:
Node.js 使用事件循环和非阻塞IO结合回调。这允许在IO调用未完成时处理其他任务,如下所示:
使用旧的 java.IO 库和线程池模式,java线程被阻塞,直到IO操作完成。与此同时,线程无法处理其他任务并被禁止安排。
但是现在。 NIO怎么样?考虑我们有一个最多10个线程的线程池。
每个线程都以Runnable
对象的形式获得一些工作。
如果需要长期的IO操作,会发生什么。在最初的IO调用完成之前,我无法相信当前未撤消的Runnable
将被其他人取代。
那么与java.NIO
相比,如何更改java.IO
Java中的调度行为?
答案 0 :(得分:3)
本质上,NIO提供了编写自己的单线程事件循环的方法,类似于node.js.相比之下,Java IO没有提供这样的手段。
实现可能有所不同,但实质上,您可以创建一个从Selector读取的线程,并为每个成功的选择执行一些注册的回调。然后,对于每种新类型的IO,您可以使用相同的Selector注册它的Channel(或任何东西),并以这种方式实现100%相同(但更灵活)的单线程回调事件循环实现。 NIO本身并不提供这样的事件循环或任何类似的东西,如果这就是你所要求的。
值得注意的是,NIO背后的实施因底层的基础设施而异。例如,在POSIX系统中使用NIO写入文件将转换为本机OS调用,而在运行它时,一些阻止IO-only-OS将使Java为每个IO创建一个单独的线程以实现向后兼容(因为在技术上不会有其他做NIO的方法。
我希望能回答你的问题,这有点模糊。