熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java高級技術 >> 正文

進程、線程與項目的關系

2013-11-23 19:44:55  來源: Java高級技術 

  首先在Visual Studio新建了一個WinForm項目WinFormApp裡面會默認有個叫Form的窗口假設項目WinFormApp的功能是為了查詢遠端Ftp服務器的文檔目錄然後把查到的結果顯示到Form的界面上通常的做法是在Formcs類中添加一個QueryFtpFiles()方法用於對遠端的ftp服務器進行讀操作然後把讀到的內容顯示到界面上就算完成了

  在這個項目完成後一般會先在本地或局域網內的某個Ftp服務器上先做個測試這時你會發現程序很完美地運行著當你興致沖沖地把代碼交給你領導的時候你的上司拿了遠在美國的ftp服務器來試運行點擊查詢按鈕執行QueryFtpFiles()查詢操作的時候悲劇發生了——頁面死掉了(沒有響應)……你是不是覺得很沒面子?有木有?

  這裡有個問題就是在執行QueryFtpFiles()方法時由於是對遠端的ftp服務器進行讀操作本身IO操作就比較耗時再考慮到網絡延遲等因素你的界面就不得不停下了等待讀操作的完成如果在這個讀操作完成前你急不可耐地點了下界面就出現了沒有響應的後果

  其實我在運行這個項目的時候實際上是在運行由這個項目自動在Debug或Release目錄下生成的WinFormAppexe應用程序而WinFormAppexe對於我的Windows Server即操作系統來說他就是一個進程

  操作系統書中講傳統的進程有兩個基本屬性擁有資源的獨立單位和可獨立調度和分配的基本單位由於在進程的創建撤銷和切換中系統必須耗費較大的時空開銷引入線程後傳統的進程的兩個基本屬性分開線程作為調度和分配的基本單位進程作為獨立分配資源的單位也就是說在完成一個復雜的功能時可以在一個進程中建立多個線程每個線程分別完成某一項簡單功能進程通過調度和排列組合這些線程來實現這個復雜的功能

  線程其實就是一段代碼一個方法或一連串方法這段代碼或方法可以去完成某個功能也可以什麼都不用做比如上面提到的QueryFtpFiles()它其實就滿足作為線程的基本條件

  再回到原來的沒有響應的問題上在執行WinFormAppexe這個進程的時候這個進程會調用UI線程其實也就是Formcs內的代碼以及它調用的其他類的代碼因為QueryFtpFiles()也在Formcs這個類中所以它也算是UI線程的一部分WinFormAppexe進程執行時會首先調用這個UI線程(若沒有定義其他線程這時UI線程應該也是這個進程的唯一線程)這個UI線程在執行QueryFtpFile()方法的過程中由於耗時很多以至於這個進程其他什麼什麼操作都要停下來等待包括你去點擊界面的操作

  問題的描述應該就是這樣了至於解決方法可以在UI線程中再定義另外一個線程thread用來執行QueryFtpFile()方法就可以了


From:http://tw.wingwit.com/Article/program/Java/gj/201311/27390.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.