在WatchService中,key.pollEvents()和key.reset()之间发生了什么



看看这个Java示例,关于密钥状态,Oracle说:

Ready表示密钥已准备好接受事件。第一次创建时,密钥处于就绪状态。

有信号表示一个或多个事件已排队。一旦钥匙已发出信号,在重置之前,它不再处于就绪状态方法。

WatchKey中javadoc:

当密钥处于信号状态时检测到的事件将排队,但不要使密钥重新排队以便从手表中检索服务

文档没有说明key.pollEvents()key.reset()之间生成的事件会发生什么假设事件将被缓冲,直到密钥被重置,并且密钥将在重置后立即发出信号。下面的测试似乎支持了这一点。

你能给我指一些官方文档吗?还是关于缺乏文件的讨论


Path dir = Paths.get("test");
WatchService watcher = dir.getFileSystem().newWatchService();
dir.register(watcher, CREATE, DELETE, MODIFY);
while (true) {
    WatchKey key = watcher.take();
    System.out.println("polling.");
    for (WatchEvent<?> event : key.pollEvents()) {
        ... (details removed) ...
        System.out.format("  Event %s in [%s] for entry [%s]%n",
                          event.kind().name(), registeredDir, childPath);
        try { Thread.sleep(20000); } catch (InterruptedException e) { ; }
    }
    System.out.println("resetting.");
    key.reset();
}

sleep()允许的20秒内,我做到了:

  • 创建一个文件
  • 编辑它,保存它
  • 重命名它
  • 编辑它,保存它
  • 删除它

输出:

polling.
  Event ENTRY_CREATE in [test] for entry [testfile1.txt]
resetting.
polling.
  Event ENTRY_MODIFY in [test] for entry [testfile1.txt]
  Event ENTRY_DELETE in [test] for entry [testfile1.txt]
  Event ENTRY_CREATE in [test] for entry [testfile2.txt]
  Event ENTRY_MODIFY in [test] for entry [testfile2.txt]
  Event ENTRY_DELETE in [test] for entry [testfile2.txt]
resetting.

Tks。

看起来像是缓冲了其他事件,当缓冲区填满时,这些事件将被处理或被赋予OVERFLOW的事件类型。

来自watchservice的文档:

"文件系统报告事件的速度可能快于检索或处理事件的速度,并且实现可能对其累积的事件数量施加未指定的限制。如果实现故意丢弃事件,则它会安排键的pollEvents方法返回事件类型为OVERFLOW的元素。消费者可以将此事件用作重新检查的触发器对象的状态。">

相关内容

  • 没有找到相关文章

最新更新