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 以获得更深入的解释。
这是来自 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 以获得更深入的解释。