關於執行緒設計的感受

raorq發表於2020-04-06
            前陣子寫WapExplorer時,設計網路那一部分我採用的是執行緒程式設計,採用執行緒設計也有段時間了,但卻總是Copy-plaster,所以一直對它的機制不是很瞭解,直到那天碰到一個很白痴的問題(明明我啟動一個執行緒去下載網路資料)為什麼程式還提示你要採用執行緒去操作,這樣才不會阻塞。具體看下程式碼
程式碼有詳細解釋
java 程式碼
 
  1. public class WapDownload  extends Thread{  
  2.     private static Logger logger = Logger.getLogger("WapDownload");  
  3.     WmlParser wp;   
  4.     String url;  
  5.    
  6.     WapDownload(String url,MainForm mainForm) throws XmlPullParserException, IOException{  
  7.         logger.debug("啟動一個下載執行緒");  
  8.         this.url = url;  
  9.         wp = WmlParser.getWmlParser();  
  10.         wp.setMainForm(mainForm); 
  11.          //這段程式碼不能放在這裡,因為
  12.         ///setInput(); 
  13.         start();  
  14.     }  
  15.     public void run() {  
  16.         setInput();  
  17.          try {  
  18.              wp.parser();  
  19.                
  20.         } catch (XmlPullParserException e) {       
  21.             e.printStackTrace();  
  22.         } catch (IOException e) {      
  23.             e.printStackTrace();  
  24.         }  
  25.     }  
  26.        
  27.     //開啟網路資源,其實WmlPaser通過setInput方法進行資料下載,這段程式碼不能放到初始話裡
  28.     //應該放在run方法。這樣才能保證真正的執行緒去讀取資料。
  29.     private void setInput() {  
  30.         try {  
  31.             wp.setInput(HttpProxyHandler.openInputStream(url),"UTF-8");  
  32.         } catch (XmlPullParserException e) {  
  33.             e.printStackTrace();  
  34.         } catch (IOException e) {          
  35.             e.printStackTrace();  
  36.         }  
  37.           
  38.     }  
  39.     public static WapDownload openWapDownload(String url, MainForm mainForm) throws XmlPullParserException, IOException{  
  40.         return new WapDownload(url, mainForm);  
  41.     }        
  42. }  


經過上面的經驗後,發覺,啟動一個執行緒,執行緒真正工作的地方是run。
在程式初始話方法(構造方法,還是在主程式裡執行,要呼叫start()才算是啟動執行緒)
我好笨啊。看來我離真正的程式設計師還有一段距離

相關文章