- 所有已知实现类:
SimpleWatcherMgr
@ThreadSafe
public interface WatcherMgr<E>
Watcher管理器
监听器用于拦截插入到任务队列中的事件,在接收到一个事件时,将判断是否存在Watcher,
1.如果不存在Watcher,事件将被插入任务队列。
2.如果存在Watcher,事件将调用WatcherMgr.Watcher.test(Object)方法测试事件。
2.1 如果不是Watcher等待的事件,事件将被插入任务队列。
2.2 如果是Watcher等待的事件,将删除Watcher,然后调用WatcherMgr.Watcher.onEvent(Object)方法处理事件 -- 即:Watcher是一次性的。
3.管理器中的watcher可能是多个,测试时将逐个测试
一些指导:
1.监听器应该设定超时时间,不可无限阻塞,否则可能有死锁风险,或者总是超时失败 -- 如果任务队列是有界的。
2.应当先watch再执行阻塞等操作,否则可能丢失信号。
3.在不需要使用的时候及时取消watch -- 建议在try-finally块中执行。
4.实现必须是线程安全的,因为事件的发布者通常是另一个线程 -- 通常可以通过Future实现跨线程数据传输。
5.监听和取消监听都是低频操作,因此可以简单实现为synchronized写,volatile读。
6.为不同的入口分配不同的WatcherMgr有助于分散测试,提高性能。
- 作者:
- wjybxx date 2023/4/5
-
嵌套类概要
嵌套类 -
方法概要
修饰符和类型方法说明booleancancelWatch(WatcherMgr.Watcher<?> watcher) 取消监听 该方法既可能是注册监听器的代码执行,也可能是提交事件的线程(watcher的一次性原理) 如果是监听者自身调用,则可以根据返回值检测到冲突,从而采取对应的行为,这时事件的生产者可能将调用WatcherMgr.Watcher.onEvent(Object)。boolean测试是否是Watcher等待的事件voidwatch(WatcherMgr.Watcher<? super E> watcher) 监听队列中的事件,直到某一个事件发生。
-
方法详细资料
-
watch
监听队列中的事件,直到某一个事件发生。 (该方法通常由当前线程调用)- 参数:
watcher- 监听器- 抛出:
NullPointerException- watcher is null- 另请参阅:
-
cancelWatch
取消监听 该方法既可能是注册监听器的代码执行,也可能是提交事件的线程(watcher的一次性原理) 如果是监听者自身调用,则可以根据返回值检测到冲突,从而采取对应的行为,这时事件的生产者可能将调用WatcherMgr.Watcher.onEvent(Object)。- 参数:
watcher- 用于判断是否是当前watcher- 返回:
- 如果参数为null,则返回false;如果watcher存在,则删除并返回true,否则返回false
-
onEvent
测试是否是Watcher等待的事件- 返回:
- 如果事件被watcher消费则返回true,否则返回false
-