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