Java 中的 Filewatcher 是否被视为非阻塞 IO?

Is Filewatcher considered non blocking IO in Java?

这是来自 FileWatcher java 7 nio 库的代码片段。 它是非阻塞代码吗?此线程等待来自文件系统的信号。

for (;;) {
    // wait for key to be signaled
    WatchKey key;
    try {
        key = watcher.take();
    } catch (InterruptedException x) {
        return;
    }
}

Filewatcher 使用 EPOLL,这是一个 Linux 系统调用。它是一种基于事件的多路复用机制。对于 Windows 有 SELECT 做同样的事情,但效率要低得多,在 BSD 中(OSX 是基于)有 KQUEUE.

简单来说,它所做的就是在等待事件发生的系统中注册一个事件处理程序。随着时间的推移,系统会查看所有排队的事件处理程序,看看是否有一个准备好继续进行。如果有一个事件处理程序将其事件标志设置为 true,那么它将处理该事件。如果没有事件发生,它将一直循环直到找到发生的事件。

同时,main 中的代码继续 运行,从而为您提供它所承诺的 "non-blocking" 功能。

这不是新技术,尽管随着 NodeJS、Swift 和其他非阻塞语言/框架的兴起,ASYNC 最近变得非常流行,WIN32 API 有效 - 简而言之,它都是基于事件的。

您可以查看此 link 以获得更深入的解释。