这是FileWatcher Java 7 nio库中的代码片段。
它是非阻塞代码吗?该线程等待来自FileSystem的信号。
for (;;) {
// wait for key to be signaled
WatchKey key;
try {
key = watcher.take();
} catch (InterruptedException x) {
return;
}
}
最佳答案
Filewatcher使用EPOLL
,这是Linux系统调用。这是一种基于事件的多路复用机制。对于Windows,有SELECT
可以执行相同的操作,但是效率要低得多,在BSD(基于OSX的BSD)中有KQUEUE
。
简单来说,它在系统中注册一个等待事件发生的事件处理程序。随着时间的流逝,系统将查看所有排队的事件处理程序,并查看是否有准备进行的事件处理程序。如果有一个事件处理程序将其事件标志设置为true,则它将处理该事件。如果没有事件,它将一直循环直到找到发生的事件。
同时,main中的代码继续运行,从而为您提供了它所承诺的“非阻塞”功能。
虽然这不是一项新技术,但是随着NodeJS,Swift和其他非阻塞语言/框架的兴起,ASYNC最近变得非常流行,这就是WIN32 API的工作原理-简而言之,它是基于事件的。
您可以查看此link以获得更深入的说明。