如何正确的使用Java事件通知(1)(4)
分享于 点击 6614 次 点评:287
异常处理
本文的最后介绍了如何处理抛出 RuntimeExceptions 的那些损坏的监听器。尽管我总是严格对待 fail-fast 错误机制,但在这种情况下让这个异常得不到处理是不合适的。尤其考虑到这种实现经常在一些多线程环境里被用到。
损坏的监听器会有两种方式来破坏系统:第一,它会阻止通知向观察者的传达过程;第二,它会伤害那些没有准备处理好这类问题的调用线程。总而言之它能够导致多种莫名其妙的故障,并且有的还难以追溯其原因,
因此,把每一个通知区域用一个 try-catch 块来保护起来会显得比较有用。
- private void broadcast( StateEvent stateEvent ) {
- listeners.forEach( listener -> notifySafely( stateEvent, listener ) );
- }
- private void notifySafely( StateEvent stateEvent, StateListener listener ) {
- try {
- listener.stateChanged( stateEvent );
- } catch( RuntimeException unexpected ) {
- // appropriate exception handling goes here...
- }
- }
总结
综上所述,Java 的事件通知里面有一些基本要点你还是必须得记住的。在事件通知过程中,要确保在监听器集合的快照里做迭代,保证事件通知在同步块之外,并且在合适的时候再安全地通知监听器。
但愿我写的这些让你觉得通俗易懂,最起码尤其在并发这一节不要再被搞得一头雾水。如果你发现了文章中的错误或者有其它的点子想分享,尽管在文章下面的评论里告诉我吧。

用户点评