基礎(chǔ)入門(mén):Java多線(xiàn)程編程經(jīng)驗(yàn)談
不管我是多么喜歡JAVA但是,從實(shí)際開(kāi)發(fā)角度講,Java的多線(xiàn)程確實(shí)沒(méi)有C++好使。
表現(xiàn)在:
1.Java沒(méi)有全局變量;
2.Java 的線(xiàn)程之間的通信比較差,C++提供了多種通信方式;
3.Java的數(shù)據(jù)同步是通過(guò)synchronized來(lái)實(shí)現(xiàn),但是基本上等于交給了虛擬機(jī)來(lái)完成,而C++有很多種:臨界區(qū)、互斥體等。
4. Java的多線(xiàn)程run方法沒(méi)有返回值,因此如何能得到子線(xiàn)程的反饋信息,確實(shí)令人頭疼。
5.Java的多線(xiàn)程是協(xié)作式,這樣等于操作系統(tǒng)放棄了對(duì)線(xiàn)程的控制;
這里談?wù)勎以趈ava多線(xiàn)程中的編寫(xiě)經(jīng)驗(yàn):
1.創(chuàng)建thread時(shí),將主控類(lèi)或者叫做調(diào)用類(lèi)傳入構(gòu)造函數(shù)中,例如:
Class A調(diào)用Class B,Class A作為Class B構(gòu)造函數(shù)的參數(shù)。
這樣再創(chuàng)建一個(gè)子線(xiàn)程時(shí),用同樣的方式實(shí)現(xiàn),這樣主控類(lèi)的實(shí)例變量就可以作為全局變量,當(dāng)然要注意同步。
2. 類(lèi)同步中wait(),notify()一定要考慮好邏輯,不然有可能造成阻塞。
3. 如果多個(gè)線(xiàn)程調(diào)用或者目前不是很清楚有多少個(gè)線(xiàn)程進(jìn)行通信,最好的辦法是自己實(shí)現(xiàn)一個(gè)listener,然后調(diào)用類(lèi)調(diào)用Listener的一個(gè)實(shí)例方法進(jìn)行通信。
工作原理:
1) Listener接口提供同步方法 例如SynData();
2) 同步線(xiàn)程提供添加和刪除Listener的方法,同時(shí)在線(xiàn)程中對(duì)注冊(cè)Listener的類(lèi)進(jìn)行輪流通知;
3) 使用給同步數(shù)據(jù)的線(xiàn)程類(lèi),繼承Listener接口,實(shí)現(xiàn)其方法,將本線(xiàn)程即將結(jié)束的數(shù)據(jù)發(fā)送到同步線(xiàn)程中;
其實(shí)這個(gè)原理來(lái)自于Java Swing技術(shù)。