關於建立及使用多線程的幾種方法,多線程幾種方法

來源:互聯網
上載者:User

關於建立及使用多線程的幾種方法,多線程幾種方法

近期剛剛學習了一種多線程技術,現結合自己的理解將其羅列出來,希望能夠與大家交流一下,多線程是一種能夠節省程式運算時間的方法,大大的提高了程式的運算效率,那麼首先我們來說一下進程和線程概念:

  一個程式包含一個以上的進程,而一個進程又可以包含一個以上的線程,每一個進程都有自己獨立的記憶體空間,相應的一個進程中的所有線程都共用該記憶體空間。

  進程:是一個具有一定獨立功能的程式關於某個資料集合的一次運行活動。它是作業系統動態執行的基本單元,在傳統的作業系統中,進程既是基本的資源分派單元,也是基本的執行單元。獨立的地址空間使得不同的進程共用狀態資訊變得非常困難,為了共用資訊,它們必須顯式的使用(進程通訊機制),進程之間通訊比較慢,因為進程式控制制和進程式通訊機制開銷很大。

  線程:進程作為分配資源的基本單位,而把線程作為獨立運行和獨立調度的基本單位,由於線程比進程更小,基本上不擁有系統資源,故對它的調度所付出的開銷就會小得多,能更高效的提高系統內多個程式間並發執行的程度。一個線程就是運行在進程內容相關的一個邏輯流。現代作業系統允許我們編寫一個進程裡同時運行多個線程的程式。線程由核心調度。每個進程開始生命週期時都是單一線程,這個線程稱為主線程,在某一時刻,主線程建立一個對等線程。從這個時間點開始,兩個線程就並發運行。最後,因為主線程執行一個慢速系統調用,如read或者sleep,控制就會通過環境切換傳遞到對等線程。在控制傳遞迴主線程前,對等線程會執行一段時間。

 

  (一) 傳統的程式執行方式是一種順序執行方式,即本句執行完成之後,才會執行下一句。

     在調用一個函數或者執行一個數位塊時,執行該程式佔用系統主程式的執行時間,也就是說,這個函數或代碼塊不執行完系統是不會執行下一條指令的:

     例如: 我們在主函數裡調用 [self doOneThing];[self doTheSecondThing]; 只有第一個正確執行後才會執行下一個函數。

 

  (二) 多線程下程式塊可以並發執行,大大地節省了程式的執行時間,下面列出建立多線程的幾種方式:

      (1)使用performSelectorInBackground建立一個線程:也就是說在程式執行doThing與執行下一段程式是同步執行的

        [self performSelectorInBackground:@selector(doThing) withObject:nil];

    

      (2)直接建立一個線程,selector選取器則指明將要進行的操作,用這種方法時線程直接啟動:

        [NSThread detachNewThreadSelector:@selector(doThing) toTarget:self withObject:nil];

      

      (3)建立一個線程並設定啟動方式

        NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(doThing) object:nil];

           thread.name = @"QingYun";

              [thread start];

 

      (4)建立一個多線程的隊列

        NSOperationQueue *queue = [[NSOperationQueue alloc] init];

          建立一個操作對象,這個操作對象定義了多線程需要執行作務

          NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(doThing) object:nil];

         [queue addOperation:operation];       //    將操作對象放到這個隊列裡,這樣線程就可以直接啟動

 

       (5)使用Block塊操作對象的方式建立線程,添加到隊列中並啟動線程

        NSOperationQueue *queue = [[NSOperationQueue alloc] init];

            NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{

             NSLog(@"do thing....");

         [NSThread sleepForTimeInterval:10];}

        [queue addOperation:operation];

 

       (6)使用隊列分發模式建立線程:下面以非同步分發建立線程為例說明其工作原理,在非同步線程中,在分發時系統對線程按順序分發下去,但在執行的過程中,則線程之間又存在相互競爭的關係。

        dispatch_queue_t queque = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

         dispatch_async (queque,^{  [NSThreadsleepForTimeInterval:5];};

        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{[NSThreadsleepForTimeInterval:5];};

    

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.