事件的監(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);

       }

}