談談多線程開發中的線程和任務的理念
前段時間寫了一個iOS端的數據統計SDK,數據統計有些復雜的計算和數據上報操作。由於有些操作比較耗時。所以不得不在後臺線程進行操作,由此引發了我對多線程的思考,在iOS開發中,一般非常難再見到直接使用NSThread進行多線程編程的了。由於蘋果提供了另外幾種多線程開發的解決方式。而這些解決方式面向的不再是線程,而是面向的是任務,以下就來以iOS和Android為例簡單談談的線程和任務的相關概念。
線程:
我們在學習基礎的編程語言的時候,肯定聽說過線程的概念,線程是操作系統調度的最小單位,共享進程資源。可能對於非常多人來說多線程編程並非特別在意。可是當你真的有需求的時候要不太好使用。比如我有一個需求:如今有一系列的操作都要在其它線程中完畢,而且任務的運行的先後順序就是任務加入的順序,而且讓不同 的任務按順序依次運行。那麽這時候可能你首先會想開多個線程,然後你就會想如何控制各個線程運行的順序呢?顯然這樣的順序是非常難控制的。由於你非常難控制哪個線程先運行,哪個線程後運行。
很熟悉java代碼線程池的同學肯定會想到用java中的線程池ThreadPoolExecutor,然後讓其最大的線程數設置為1,這樣就能夠實現上述需求,不錯這樣做的確能夠實現上述需求,只是ThreadPoolExecutor的內部是如何做到的呢?ThreadPoolExecutor的實現原理是如何的呢?難道ThreadPoolExecutor脫離了java線程的概念 有特殊的權限?
假設熟悉OC的同學可能會立刻想起一種並發編程技術:GCD這樣的技術能夠設置一個串行隊列,然後增加異步任務就能夠實現,確實也是能夠實現的。
不同語言中的不同的技術確實都能夠實現此類需求。
可這些技術的實現是否脫離了操作系統本身的多線程機制,擁有特殊權限。特殊API?答案是否定的,以下就來說說任務的概念。
任務:
任務和多線程沒有關系的,一個任務可能就是若幹操作的集合。假設我們轉變思想,把面向線程的編程改成面向任務的編程,那麽並發編程是不是就擁有更好的可控制性,包含順序。線程數量等等。任務的核心概念就是把任務放到任務隊列中。然後開啟指定個數的線程不停的從任務隊列中取得對應的任務在本線程中運行,因為任務是放在任務隊列中的,因為隊列的特性,能夠保證任務的運行是依照放入隊列中的順序運行的。
而且能夠指定最大開多少個線程,這樣就能夠保證性能的消耗不是無限制的添加。事實上java中的ThreadPoolExecutor就是這樣實現的,放入當中的每一個Runnable對象,就是一個一個的任務。然後ThreadPoolExecutor
講到這裏大家是不是對線程和任務的概念有一些理解了,如有不妥歡迎拍磚。
談談多線程開發中的線程和任務的理念