国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

關于創建及使用多線程的幾種方法

2019-11-14 20:29:13
字體:
來源:轉載
供稿:網友

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

  一個程序包含一個以上的進程,而一個進程又可以包含一個以上的線程,每一個進程都有自己獨立的內存空間,相應的一個進程中的所有線程都共享該內存空間。

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

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

 

 ?。ㄒ唬?傳統的程序執行方式是一種順序執行方式,即本句執行完成之后,才會執行下一句。

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

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

 

 ?。ǘ?多線程下程序塊可以并發執行,大大地節省了程序的執行時間,下面列出創建多線程的幾種方式:

     ?。?)使用performSelectorInBackground創建一個線程:也就是說在程序執行doThing與執行下一段程序是同步執行的

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

    

     ?。?)直接創建一個線程,selector選擇器則指明將要進行的操作,用這種方法時線程直接啟動:

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

      

     ?。?)創建一個線程并設置啟動方式

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

           thread.name = @"QingYun";

              [thread start];

 

     ?。?)創建一個多線程的隊列

        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];

 

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

        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];};

    

 

    

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 贡嘎县| 正宁县| 太保市| 湖口县| 仁寿县| 青河县| 溧水县| 根河市| 砀山县| 靖远县| 枞阳县| 兴安盟| 朝阳区| 盐池县| 汶川县| 嘉禾县| 监利县| 华池县| 南召县| 沙雅县| 方正县| 遵义市| 高淳县| 湖州市| 鄄城县| 广河县| 白沙| 景德镇市| 志丹县| 萨嘎县| 伊吾县| 彭山县| 呼和浩特市| 腾冲县| 永城市| 绿春县| 武安市| 顺昌县| 镇平县| 内黄县| 鄱阳县|