新手來線程的概念。我對線程一點困惑。在程序中使用線程有什麼優勢?
通常調用方法和使用線程調用方法有什麼區別。什麼是thread.join的用法?
示例: 在後面文件的代碼:正常調用方法
Getdata();
通過使用線程正在呼叫的此收作方法初探:
Thread th=new Thread(new ThreadStart(Getdata));
th.Start();
哪一個產生高性能
新手來線程的概念。我對線程一點困惑。在程序中使用線程有什麼優勢?
通常調用方法和使用線程調用方法有什麼區別。什麼是thread.join的用法?
示例: 在後面文件的代碼:正常調用方法
Getdata();
通過使用線程正在呼叫的此收作方法初探:
Thread th=new Thread(new ThreadStart(Getdata));
th.Start();
哪一個產生高性能
擁有多個線程的主要原因是加速計算。每個線程將執行復雜計算的一部分,在輸入數據的一部分上執行。如果處理器內核的線程數與處理器內核數量一樣多,則每個線程將自由運行,並且每秒的計算次數也會增加。增加此點以上的線程數量(內核數量)不會帶來太多好處。必須注意處理器體系結構的其他部分(內存,處理器緩存和其他一些共享資源),以免它成爲瓶頸並迫使所有線程在大多數時間等待它。
擁有線程的第二個原因是從主線程(通常是GUI線程)中移除所有冗長的操作。應用程序則更加用戶友好,用戶不會遇到窗口「凍結」。
有線程的第三個原因是使代碼同時更快更簡單。假設您對數據和共享資源(Web服務,數據庫,某些專用硬件,打印機)有複雜的操作,複雜的操作可以通過幾個更簡單的操作分開,並且根據數據省略部分操作。你可以有一個線程的「管道」,每個線程對數據做一個簡單的事情,擁有一些資源的獨佔訪問權,並將結果發送到管道中的其他線程。整個過程的運行速度要比只有一個線程從頭到尾運行每一位數據的速度快,但代碼也不會太複雜。
通過使用線程你可以讓緩慢運行的進程運行「除了」其餘的代碼。
加入你在等待那段代碼完成。
舉例說,你通過網絡從3臺不同的慢速服務器獲取數據。那麼啓動樹形線程獲取這些數據然後在進行計算之前加入它們是一個好主意。這樣,當最慢的服務器響應而不是所有三臺服務器的組合時間時,就可以開始計算。
關於性能,你可以擁有一臺多核機器。通過線程化你可以利用更多的內核,所以你也可以獲得更好的性能。
讓我們把它歸結爲一個簡單的例子。你的電腦中有一個雙核心處理器。假設每個核心一次只能處理一個線程(實際上,他們可以很快地切換)。
爲了一次運行兩段代碼,您需要2個線程。如果您只是將第二個線程的代碼附加到第一個線程的末尾,那麼第二個線程將不得不等待第一個線程的代碼完成。線程1據說是阻止。線程2據說是等待。
線程有很大的應用。考慮遊戲,場景的渲染是循環執行的。每幀之間的任何繁重處理都會導致幀速率下降。你想避免這種情況。你是做什麼?您在另一個線程上執行繁重的處理,並相信操作系統將充分利用可用的CPU內核。
線程化的目的是爲了滿足在同一時間運行不同代碼的需要。一般來說,如果你有一個源代碼,你的源代碼中的所有行將被順序執行。讓我們考慮一下當您發送電子郵件到20個收件人的情況。如果您一個接一個地發送所有郵件,那麼總的等待時間就是郵件發送時的總時間。如果您創建20個線程,每個電子郵件發送一個線程,那麼您的等待時間將大致爲最慢郵件的時間,即大約爲20倍的加速時間。另外,讓我們考慮你正在玩電腦上的國際象棋比賽。引擎必須不斷思考最佳可能的變化,但同時它的時間正在減少,並且必須以圖形方式顯示,有時候還應該顯示聲音效果等等。
我會說這取決於程序,有時不需要使用線程,因爲程序本身並不需要它,但有時它確實有幫助,特別是當涉及到使用GUI時,線程允許用戶執行在處理某些事情時採取行動。總而言之,我想說在這裏說得太多了,我猜得太多了。 – Tafari
我不知道你的GetData(),但如果你可以分開GetData讓我們說兩個部分,那麼你可以使用線程來讓它更快。你可以運行兩個線程,首先獲得一部分數據,然後休息。 – Tomq
@Tomq什麼是thread.Join在運行多個線程時使用 – user2918543