Thread-Per-Message模式是一個(gè)很簡(jiǎn)單但很常應(yīng)用的模式,尤其是在GUI程式中,我們舉個(gè)例子,當(dāng)您設(shè)計(jì)一個(gè)文件編輯器時(shí),您可能像這樣註冊(cè)一個(gè)開(kāi)啟檔案的事件處理:
menuOpenFile.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
openFile();
}
}
);
openFile()方法中主要是開(kāi)啟檔案、一行一行讀檔案文字並設(shè)定文字至文字區(qū)域中,這樣設(shè)計(jì)基本上沒(méi)有什麼問(wèn)題,例如果您的文件內(nèi)容很長(zhǎng),在讀檔必須花費(fèi)一些時(shí)間時(shí),您會(huì)發(fā)現(xiàn)在檔案讀取完畢前,您的視窗會(huì)有明顯的停頓現(xiàn)象。
menuOpenFile.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
new Thread(new Runnable(){
public void run() {
openFile();
}
}).start();
}
}
);
在事件發(fā)生之後,您將檔案處理的動(dòng)作交由一個(gè)執(zhí)行緒去執(zhí)行,而事件處理執(zhí)行緒直接回到回應(yīng)事件的狀態(tài),如此即可解決視窗在載入檔案時(shí)的停頓。
簡(jiǎn)單的說(shuō),Thread-Per-Message模式是在某個(gè)請(qǐng)求發(fā)生時(shí),新增一個(gè)執(zhí)行緒來(lái)執(zhí)行該請(qǐng)求,而主執(zhí)行緒繼續(xù)往下執(zhí)行,除了上面的載入檔案例子之外,像是進(jìn)行搜尋、字串轉(zhuǎn)換之類(lèi)需要一些時(shí)間來(lái)執(zhí)行的工作時(shí),使用Thread-Per-Message模式都可以提高主執(zhí)行緒(界面)的回應(yīng)性。