一去团、為什么GUI是單線程化
傳統(tǒng)的GUI應(yīng)用程序通常都是單線程的瑰枫。
1. 在代碼的各個(gè)位置都需要調(diào)用poll方法來(lái)獲得輸入事件(這種方式將給代碼帶來(lái)極大的混亂)
2. 通過(guò)一個(gè)“主事件循環(huán)(Main Event Loop)”來(lái)間接地執(zhí)行應(yīng)用程序的所有代碼。
如果在主事件循環(huán)中調(diào)用的代碼需要很長(zhǎng)時(shí)間才能執(zhí)行完成偶惠,那么用戶界面就會(huì)“凍結(jié)”春寿,直到代碼執(zhí)行完成。這是因?yàn)橹挥挟?dāng)執(zhí)行控制權(quán)返回到主事件循環(huán)后忽孽,才能處理后續(xù)的用戶界面事件绑改。
很多嘗試多線程的GUI框架的努力,最總都因?yàn)殪o態(tài)條件和死鎖導(dǎo)致的穩(wěn)定性問(wèn)題兄一,又回到單線程的時(shí)間隊(duì)列模型的老路上厘线。
1. 順序事件處理
因?yàn)橹挥形ㄒ坏木€程在處理GUI任務(wù),所有任務(wù)都不需要考慮并發(fā)且都是順序執(zhí)行出革,但是問(wèn)題是如果在任務(wù)中執(zhí)行時(shí)間過(guò)長(zhǎng)造壮,或?qū)е潞罄m(xù)操作無(wú)法響應(yīng)。(Android會(huì)提示Andorid Not Response異常)
2. Swing中的線程限制
GUI的單線程規(guī)則:組件與模型只能在事件分派線程中被創(chuàng)建蹋盆、修改和請(qǐng)求费薄。
在Andorid中如果在子線程進(jìn)行創(chuàng)建或者更新UI操作會(huì)拋出異常硝全。
GUI應(yīng)用程序中,事件起源于事件線程伟众,冒泡似得傳遞到達(dá)應(yīng)用程序提供的監(jiān)聽(tīng)器析藕,如果是比較簡(jiǎn)單的修改顏色等,可以直接在事件線程中處理凳厢。
因?yàn)镚UI任務(wù)有線程限制,所以需要子線程處理耗時(shí)操作先紫,通常最后還需要在子線程進(jìn)行刷新治泥。
1. 取消
2. 進(jìn)度與完成標(biāo)識(shí)
3. SwingWorker
在Andorid中使用AsyncTask
避免響應(yīng)性的最簡(jiǎn)單的方式是初始化時(shí)一次性讀取到內(nèi)存中遮精,這樣需要考慮是否占用內(nèi)存過(guò)多的問(wèn)題居夹。
1. 線程安全的數(shù)據(jù)模型
ConcurrentHashMap無(wú)法提供一致的數(shù)據(jù)快照败潦。
CopyOnWriteArrayList同時(shí)獲得線程安全性、一致性以及良好的響應(yīng)性准脂。
2. 分解數(shù)據(jù)模型
如果一個(gè)數(shù)據(jù)模型必須被多個(gè)線程共享劫扒,而且由于阻塞、一致性或復(fù)雜度等原因無(wú)法實(shí)現(xiàn)一個(gè)線程安全的模型時(shí)狸膏,可以考慮使用分解模型設(shè)計(jì)沟饥。
一些情況下無(wú)法避免同步或者死鎖問(wèn)題湾戳,例如:原生庫(kù)(Native Library)要求贤旷、通過(guò)System.loadLibrary加載時(shí),都必須放在同一個(gè)線程中執(zhí)行院塞。
將Future和newSingleThreadExecutor一起使用處理單線程可取消的任務(wù)遮晚。
以上就是我推薦給Java開(kāi)發(fā)者們的一面試經(jīng)典知識(shí)。但是這些知識(shí)里面并沒(méi)有太多Java全棧拦止、Java晉階县遣、JAVA架構(gòu)之類(lèi)的題,不是我不推薦汹族,而是希望大家更多的從基本功做起萧求,打好基礎(chǔ),太多復(fù)雜的內(nèi)容一會(huì)兒也說(shuō)不明白顶瞒。
好了同學(xué)們夸政,我能介紹的也都全部介紹完給你們了,如果下獲得更多JAVA教學(xué)資源榴徐,可以選擇來(lái)我們這里共同交流守问,群:240448376,很多大神在這里切磋學(xué)習(xí)坑资,不懂可以直接問(wèn)耗帕,晚上還有大牛免費(fèi)直播教學(xué)。
注:加群要求
1袱贮、具有一定工作經(jīng)驗(yàn)的仿便,面對(duì)目前流行的技術(shù)不知從何下手,需要突破技術(shù)瓶頸的可以加攒巍,有些應(yīng)屆生和實(shí)習(xí)生也可以加嗽仪。
2、在公司待久了柒莉,過(guò)得很安逸闻坚,但跳槽時(shí)面試碰壁。需要在短時(shí)間內(nèi)進(jìn)修兢孝、跳槽拿高薪的可以加窿凤。
3搀擂、如果沒(méi)有工作經(jīng)驗(yàn),但基礎(chǔ)非常扎實(shí)卷玉,對(duì)java工作機(jī)制哨颂,常用設(shè)計(jì)思想,常用java開(kāi)發(fā)框架掌握熟練的相种,可以加威恼。
4、覺(jué)得自己很牛B寝并,一般需求都能搞定箫措。但是所學(xué)的知識(shí)點(diǎn)沒(méi)有系統(tǒng)化,很難在技術(shù)領(lǐng)域繼續(xù)突破的可以加衬潦。
5.阿里Java高級(jí)大牛直播講解知識(shí)點(diǎn)斤蔓,分享知識(shí),多年工作經(jīng)驗(yàn)的梳理和總結(jié)镀岛,帶著大家全面弦牡、科學(xué)地建立自己的技術(shù)體系和技術(shù)認(rèn)知!
PS:現(xiàn)在主要講解的內(nèi)容是(反射原理漂羊、枚舉原理與應(yīng)用驾锰、注解原理、常用設(shè)計(jì)模式走越、正規(guī)表達(dá)式高級(jí)應(yīng)用椭豫、JAVA操作Office原理詳解、JAVA圖像處理技術(shù)旨指,等多個(gè)知識(shí)點(diǎn)的詳解和實(shí)戰(zhàn))
6.小號(hào)或者小白之類(lèi)加群一律不給過(guò)赏酥,謝謝。
最后谆构,每一位讀到這里的網(wǎng)友裸扶,感謝你們能耐心地看完。覺(jué)得對(duì)你有幫助可以給個(gè)喜歡低淡!希望在成為一名更優(yōu)秀的Java程序員的道路上姓言,我們可以一起學(xué)習(xí)瞬项、一起進(jìn)步