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

时间:2014-06-21 13:48:35

标签: java events watchservice

关于关键状态,请看这个Java example,Oracle说:

  

就绪表示该密钥已准备好接受事件。什么时候开始   创建后,密钥处于就绪状态。

     

已签名表示一个或多个事件已排队。一旦关键   已经发出信号,直到复位后才会处于就绪状态    方法被调用。

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 [test\file1.txt]
resetting.
polling.
  Event ENTRY_MODIFY in [test] for entry [test\file1.txt]
  Event ENTRY_DELETE in [test] for entry [test\file1.txt]
  Event ENTRY_CREATE in [test] for entry [test\file2.txt]
  Event ENTRY_MODIFY in [test] for entry [test\file2.txt]
  Event ENTRY_DELETE in [test] for entry [test\file2.txt]
resetting.

韩国社交协会

1 个答案:

答案 0 :(得分:0)

当缓冲区填满时,看起来缓冲了额外的事件并将被处理或给出事件类型OVERFLOW。

来自watchservice的文档:

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