不管我是多么喜歡JAVA但是,從實際開發角度講,Java的多線程確實沒有C++好使。
表現在:
1.Java沒有全局變量;
2.Java 的線程之間的通信比較差,C++提供了多種通信方式;
3.Java的數據同步是通過synchronized來實現,但是基本上等于交給了虛擬機來完成,
而C++有很多種:臨界區、互斥體等。
4. Java的多線程run方法沒有返回值,因此如何能得到子線程的反饋信息,確實令人頭疼。
5.Java的多線程是協作式,這樣等于操作系統放棄了對線程的控制;
這里談談我在java多線程中的編寫經驗:
1.創建thread時,將主控類或者叫做調用類傳入構造函數中,例如:
Class A調用Class B,Class A作為Class B構造函數的參數。
這樣再創建一個子線程時,用同樣的方式實現,這樣主控類的實例變量就可以作為
全局變量,當然要注意同步。
2. 類同步中wait(),notify()一定要考慮好邏輯,不然有可能造成阻塞。
3. 如果多個線程調用或者目前不是很清楚有多少個線程進行通信,最好的辦法是
自己實現一個listener,然后調用類調用Listener的一個實例方法進行通信。
工作原理:
1) Listener接口提供同步方法 例如SynData();
2) 同步線程提供添加和刪除Listener的方法,同時在線程中對注冊Listener
的類進行輪流通知;
3) 使用給同步數據的線程類,繼承Listener接口,實現其方法,將本線程即將結束的數據發送到同步線程中;
其實這個原理來自于Java Swing技術。
由于時間關系,今天就談到這里,希望能拋磚引玉!!請大家多多指教!
下一次談一談我用上面的方式實現的一個網關實例,謝謝各位!