Java传统编程模型存在的问题(2)
当真的发生错误时,这种情况会变得更糟,当异步工作线程遇到错误时候会导致最终陷入无法恢复的境地。例如由错误引起的内部异常会冒泡到线程的根,并使线程关闭。这立即引发了一个问题,谁应该重新启动该异步线程执行的任务,以及如何将其还原到已知状态?乍一看,这似乎是可以管理的,但我们突然遇到了一个新的现象:异步线程当前正在执行的实际任务我们并没有存放起来。实际上,由于到达顶部的异常使所有调用栈退出,任务状态已经完全丢失了!即使这是本地通信,也没有网络连接,但是我们还是丢失了一条消息(可能会丢失消息)。 小结: 为了在当前系统上实现任何有意义的并发性和提高性能,线程必须以高效的方式在彼此之间委派任务,而不会阻塞。使用这种类型的任务委派并发(甚至在网络/分布式计算中更是如此),基于调用堆栈的错误处理会导致崩溃。因此需要引入新的显式错误信令机制,让失败成为域模型的一部分。 具有工作委派的并发系统需要处理服务故障,并需要具有从故障中恢复的原则方法。此类服务的客户端需要注意,任务/消息可能会在重新启动期间丢失。即使没有发生损失,由于先前排队的任务(较长的队列)或者垃圾回收导致的延迟等,将会导致响应可能会被任意延迟。面对这些情况,并发系统应以超时的形式处理响应截止日期。
(编辑:ASP站长网) |