標籤:避免 ctas 模型設計 news 讀書筆記 asynctask style 時間 poll
一、為什麼GUI是單線程化傳統的GUI應用程式通常都是單線程的。
1. 在代碼的各個位置都須要調用poll方法來獲得輸入事件(這樣的方式將給代碼帶來極大的混亂)
2. 通過一個“主事件迴圈(Main Event Loop)”來間接地運行應用程式的全部代碼。
假設在主事件迴圈中調用的代碼須要非常長時間才幹運行完畢。那麼使用者介面就會“凍結”,直到代碼運行完畢。這是由於僅僅有當運行控制權返回到主事件迴圈後,才幹處理興許的使用者介面事件。
非常多嘗試多線程的GUI架構的努力,最總都由於靜態條件和死結導致的穩定性問題,又回到單線程的時間隊列模型的老路上。
1. 順序事件處理
由於僅僅有唯一的線程在處理GUI任務。全部任務都不須要考慮並發且都是順序運行,可是問題是假設在任務中已耗用時間過長,或導致興許操作無法響應。(Android會提示Andorid Not Response異常)
2. Swing中的線程限制
GUI的單線程規則:組件與模型僅僅能在事件指派線程中被建立、改動和請求。
在Andorid中假設在子線程進行建立或者更新UI操作會拋出異常。
二、短期的GUI任務GUI應用程式中,事件起源於事件線程。冒泡似得傳遞到達應用程式提供的監聽器,假設是比較簡單的改動顏色等,能夠直接在事件線程中處理。
三、耗時GUI任務由於GUI任務有線程限制,所以須要子線程處理耗時操作,通常最後還須要在子線程進行重新整理。
1. 取消
2. 進度與完畢標識
3. SwingWorker
在Andorid中使用AsyncTask
四、共用資料模型避免響應性的最簡單的方式是初始化時一次性讀取到記憶體中,這樣須要考慮是否佔用記憶體過多的問題。
1. 安全執行緒的資料模型
ConcurrentHashMap無法提供一致的資料快照。
CopyOnWriteArrayList同一時候獲得執行緒安全性、一致性以及良好的響應性。
2. 分解資料模型
假設一個資料模型必須被多個線程共用,並且因為堵塞、一致性或複雜度等原因無法實現一個安全執行緒的模型時。能夠考慮使用分解模型設計。
五、其它形式的單線程子系統一些情況下無法避免同步或者死結問題。比如:原生庫(Native Library)要求、通過System.loadLibrary載入時。都必須放在同一個線程中運行。
將Future和newSingleThreadExecutor一起使用處理單線程可取消的任務。
《Java並發編程實戰》第九章 圖形化使用者介面應用程式介面 讀書筆記