-
- All Superinterfaces:
-
AutoCloseable
,Closeable
public interface WatchService extends Closeable
手表服务, 手表已注册的对象的变化和事件。 例如,文件管理器可以使用监视服务来监视目录以进行更改,以便可以在创建或删除文件时更新其文件列表的显示。A
Watchable
对象通过调用其register
方法向手表服务注册,返回一个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
。 如果这个watch服务已经关闭了,那么调用这个方法就没有效果。- 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
检索并删除下一个watch键,如果还没有,则等待必要时直到指定的等待时间。- 参数
-
timeout
- 如何等待,放弃之前,以单位为单位 -
unit
- aTimeUnit
确定如何解释超时参数 - 结果
-
下一个手表键,或
null
- 异常
-
ClosedWatchServiceException
- 如果此手表服务关闭,或者在等待下一个键时关闭 -
InterruptedException
- 如果在等待时中断
-
take
WatchKey take() throws InterruptedException
检索并删除下一个Watch键,等待是否还没有。- 结果
- 下一个手表键
- 异常
-
ClosedWatchServiceException
- 如果此手表服务关闭,或者在等待下一个键时关闭 -
InterruptedException
- if interrupted while waiting
-
-