什么是事件处理线程(EventProcessingThread): 在启用事件处理线程时,zk的事件都是在单独的线程中处理的。 例如用户点击了一个已被监听的按钮 , 那么这个按钮的点击事件将被回传到服务器端,在事件处理阶段, zk会为该事件创建一个线程,单独 处理该事件,该线程即为事件处理线程( EventProcessingThread的实现类),如果开发者监听 了该事件,那么在该事件处理线程中(即同一线程内), 开发者监听器将被自动调用。
Messagebox.show()对话框的暂停功能如何实现的:
在启用事件处理线程时,一个注册程序,如果用户未输入用户名或密码, 调用Messagebox.show()提示用户, 代码暂停执行,当客户点击确定按钮时,代码从Messagebox.show()处继续执行。该功能是怎样实现的呢 ?从上面的事件处理线程的介绍中我们知道, 事件处理线程和开发者的事件监听器(如window实现类中的onXxx,
Composer中的onXxx, 或addEventListener注册的监听器、或者页面中组件的事件处理等等) 其实是同一线程,
在Messagebox.show()的方法内有这样一个方法Executions.wait(_mutex),该方法的功能即暂停当前事件处理线程 。当客户端点击弹出窗口上的按钮时,客户端发送该事件请求,服务器事件处理阶段,创建一个新的线程并查找
弹出窗口时的事件处理线程 ,并notify激活该线程, 然后代码会从Messagebox.show()出继续执行 从上面的介绍我们了解到,在启用事件处理线程时,所有的事件都是在事件处理线程中处理的,zk为每个事件创建崭新的线程进行处理, 当有大量用户大量的事件请求时,这将是一个不小的数目!线程之前的切换占用了大多cpu时间,并且线程本身占用很多的内存,
严重影响性能。 因此,从zk5.0以后,zk添加了禁用事件处理线程的功能,禁用事件处理线程时,所有的事件都将在
servlet线程中被处理,性能明显提高