public interface WatchService extends Closeable
一个Watchable
对象通过调用其register
方法注册到watch服务,返回一个WatchKey
来表示注册。 当检测到的对象的事件的键发出信号 ,如果当前没有信号,这是排队,以便它可以由消费者调用来检索表服务poll
种或take
方法来检索键和处理事件。 一旦事件被处理,消费者就会调用密钥的reset
方法来重置密钥,该密钥允许密钥被发信号并且进一步重新排队。
通过调用密钥的cancel
方法注销观看服务。 在被取消的时间排队的密钥保留在队列中,直到它被检索为止。 根据对象,可能会自动取消键。 例如,假设目录被监视,并且监视服务检测到它已被删除或其文件系统不再可访问。 当以这种方式取消密钥时,它将被发信号通知并排队,如果当前没有发出信号。 为确保消费者得到通知, reset
方法的返回值表示该键是否有效。
手表服务可以安全使用多个并发消费者。 为了确保只有一个消费者在任何时候处理特定对象的事件,则应注意确保密钥的reset
方法仅在其事件处理完毕后才被调用。 可以随时调用close
方法来关闭导致任何线程等待检索密钥的服务,以抛出ClosedWatchServiceException
。
文件系统可以比可以检索或处理的事件更快地报告事件,并且实现可能会对其可能累积的事件数量施加未指定的限制。 如果一个实现知道丢弃事件,那么它将安排密钥的pollEvents
方法来返回事件类型为OVERFLOW
的元素 。 消费者可以使用此事件作为重新检查对象状态的触发器。
当一个事件被报告以指示被监视的目录中的文件已被修改时,则不能保证修改该文件的程序(或程序)已经完成。 应注意与可能正在更新文件的其他程序协调访问。 FileChannel
类定义了将文件的区域锁定到其他程序访问的方法。
从文件系统观察事件的实现旨在直接映射到可用的本机文件事件通知工具,或者在本机设备不可用时使用原始机制(如轮询)。 因此,关于如何检测事件,及时性以及是否保存其顺序的许多细节都是具体实现的。 例如,当观察目录中的文件被修改时,可能会导致一些实现中的单个ENTRY_MODIFY
事件,而在其他实现中会导致一些事件。 短期文件(意味着在创建后被非常快速地删除的文件)可能不会被定期轮询文件系统以检测更改的原始实现来检测。
如果观看的文件不在本地存储设备上,那么如果可以检测到文件的更改,那么它是实现特定的。 特别地,不需要检测在远程系统上执行的文件的更改。
FileSystem.newWatchService()
void close() throws IOException
如果一个线程当前被阻塞在take
或poll
方法等待一个密钥排队,那么它会立即收到一个ClosedWatchServiceException
。 与此手表服务相关联的任何有效键均为invalidated
。
在关闭手表服务之后,任何进一步调用操作的尝试将会抛出ClosedWatchServiceException
。 如果这个watch服务已经关闭了,那么调用这个方法就没有效果。
close
中的
AutoCloseable
close
在接口
Closeable
IOException
- 如果发生I / O错误
WatchKey poll()
null
。
null
ClosedWatchServiceException
- 如果这个手表服务是关闭的
WatchKey poll(long timeout, TimeUnit unit) throws InterruptedException
timeout
- 如何等待,放弃之前,单位单位
unit
- a
TimeUnit
确定如何解释超时参数
null
ClosedWatchServiceException
- 如果此手表服务关闭,或者在等待下一个键时关闭
InterruptedException
- 如果在等待时中断
WatchKey take() throws InterruptedException
ClosedWatchServiceException
- 如果此手表服务关闭,或者在等待下一个键时关闭
InterruptedException
- if interrupted while waiting