【问题标题】:In a WatchService, what happens between key.pollEvents() and key.reset()?在 WatchService 中,key.pollEvents() 和 key.reset() 之间发生了什么?
【发布时间】:2014-08-12 02:15:09
【问题描述】:

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

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

Signaled 表示一个或多个事件已排队。一旦关键 已发出信号,它不再处于就绪状态,直到复位 方法被调用。

WatchKeyjavadoc:

在按键处于信号状态时检测到的事件已排队,但 不要导致密钥重新排队以从手表中检索 服务

文档没有说明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.

Tks.

【问题讨论】:

    标签: java events watchservice


    【解决方案1】:

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

    来自 watchservice 的文档:

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    • 2013-10-05
    • 2014-03-11
    • 2013-09-04
    • 1970-01-01
    • 2012-10-11
    相关资源
    最近更新 更多