事件的監(jiān)聽和處理 本章將描述事件是如何處理的 通過事件監(jiān)聽器發(fā)送和提交事件做為事件接受的
補充,應(yīng)用應(yīng)當(dāng)可以通過向事件監(jiān)聽器提交和發(fā)送事件在事件監(jiān)聽器之間交流。
提交事件
通過使用類org.zkoss.zk.ui.event.Events的postEvent方法,一個事件監(jiān)聽器可以提交一個事件到一個
事件隊列的隊尾。將事件放置完畢后立即返回。直到該事件之前的事件均被處理后,該事件才被進(jìn)行處
理。
發(fā)送時間
通過使用類org.zkoss.zk.ui.event.Events的sendEvent方法,一個事件監(jiān)聽器可以使ZK立刻處
理一個指定的事件。直到所有的指定事件的事件監(jiān)聽器都被處理了才返回。事件是在同一個線程中處理
的。
線程模型
對于每一個桌面,事件是順序處理的,所以線程模型是很簡單的。類似于開發(fā)桌面應(yīng)用,你不需要去擔(dān)
心多線程。你所需要去做的是登記事件監(jiān)聽器和被調(diào)用時候的處理代碼。
小提示:each event listener executes in an independent thread called event
processing thread.while the ZUML page is evaluated in the servlet thread.
掛起和恢復(fù)
對于高級的應(yīng)用,你可能需要掛氣一個執(zhí)行知道滿足繼續(xù)執(zhí)行的條件。類org.zkoss.zk.ui.Executions
的Wait,notify和notifyAll方法提供這些支持。
當(dāng)一個事件監(jiān)聽器想掛起自己,它可以調(diào)用wait方法。另一個線程在應(yīng)用指定的條件下可以通過調(diào)用
notify或者notifyAll來喚醒該進(jìn)程。下面是一個使用這種機制的例子。
Public void doModal() throws InterruptedException{
Executions.wait(_mutex);
}
Public void endModal(){
Executions.notify(_mutex);
}
這樣的使用類似于類java.long.object的wait,notify和notifyAll的用法。盡管如此,你還是不能使用
java.lang.Object的方法來進(jìn)行掛起和恢復(fù)事件監(jiān)聽器的操作。否則,關(guān)聯(lián)到這個桌面的所有事件處理
都將被停止。
注意,不同于java object的wait和notify方法,是否使用synchronized鎖來關(guān)閉Executions的wait和
notify是可選的。在上面的例子中,我們不需要這樣做,因為沒有沒有可能的racing condition。盡管
如此,如果存在racing condition,你可以象在java Object中使用wait和notify那樣使用synchronized
block。
//thread 1
Public void request()
{
Synchronized (mutex)
{
Executions.wait(mutex);
}
}
//thread 2
Public void process()
{
Synchronized(mutex)
{
Executions.notify(mutex);
}
}