这是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以获得更深入的说明。

10-05 22:55
查看更多