當前位置:編程學習大全網 - 編程語言 - 如果多線程壹個線程沒有釋放鎖,那麽他和單線程相比是否就沒有優勢了

如果多線程壹個線程沒有釋放鎖,那麽他和單線程相比是否就沒有優勢了

首先我還是說壹下我對GUI單線程消息隊列機制的理解,這是我大學裏幾年編程經驗賺來的知其然的部分。

Android、Swing、MFC等的GUI庫都使用單線程消息隊列機制來處理繪制界面、事件響應等消息,在這種設計中,每個待處理的任務都被封裝成壹個消息添加到消息隊列中。消息隊列是線程安全的(消息隊列自己通過加鎖等機制保證消息不會在多線程競爭中丟失),任何線程都可以添加消息到這個隊列中,但是只有主線程(UI線程)從中取出消息,並執行消息的響應函數,這就保證了只有主線程才去執行這些操作。

單線程消息隊列機制存在壹個問題:消息響應函數中不能有耗時長的、計算密集型的操作,因為主線程在努力地處理這樣的操作的時候就無法去處理其它的積壓在消息隊列中的繪制消息、事件消息了(壹個消息處理完了主線程才會去隊列中取下壹個消息),這時候就會出現按鍵無響應、點擊無反應的情況。

但這個問題有完美的解決方案,我們可以在消息響應函數中啟動另壹個工作線程(Worker Thread)來執行耗時操作,這樣在線程啟動起來後這個消息就算處理完了,主線程可以取下壹個消息了,這時候主線程和還未執行完計算任務的工作線程就在操作系統的調度下並駕齊驅地狂奔了(調度算法會保證兩個線程並發或並行地執行,不會專寵某個線程)。

壹般我們在耗時任務執行完後還要更新界面展示計算的結果,由於我們不能直接在工作線程中更新界面,所以可能有些小夥伴直接在消息響應函數中線程start後就接著調用join來等待線程結束以更新界面,這其實相當於把耗時任務直接放在主線程去執行,因為在消息響應函數中join其實就是主線程在join,積壓的消息是得不到處理的。正確的處理辦法是將耗時任務改為異步通知機制,即工作線程向消息隊列中添加消息以通知主線程耗時任務完成了,這樣主線程在啟動工作線程後就不需要主動地去調查任務的進展了,“任務結束的時候它會通知我的”,主線程如是說。

工作線程向主線程的消息隊列添加消息的常用方法如下:

l Android:Acitvity.runOnUiThead、Handler.post、AsyncTask

l Swing:SwingUtilities.invokeLater

l Win32、MFC:自定義用戶消息,在工作線程中PostMessage

  • 上一篇:妳寫的Python編碼,別人知道嗎
  • 下一篇:【急】用c++實現漢字轉換成拼音的程序。
  • copyright 2024編程學習大全網