多線程-1

進程:在系統中可以獨立運行並做爲資源分配的基本單位,由一組指令、數據和堆棧等組成,是一個可以獨立運行的活動實體。多線程

線程:每一個進程中至少有一個線程(結合iOS開發來講,每一個進程都至少有一個主線程,又或者說叫UI線程);併發

串行:單個任務執行,一個任務執行完畢後在執行下一個任務;框架

併發:多個任務同時執行(一般爲多線程);異步

兩者區別:任務的執行方式。async

 

同步:只能在當前線程執行,不具有開啓線程的能力;函數

異步:具有開啓新線程的能力;多個線程獨立執行;無前後順序的影響;spa

兩者區別:是否可以開啓新線程。線程

 

在iOS開發的過程當中通常有四種多線程的方法:code

1-pThread (C語言實現    支持多平臺   複雜難理解    幾乎不用)orm

2-NSThread (OC語言   簡單   偶爾使用)

3-GCD   (C語言實現    常常使用  掌握)

4-NSOperation  (對GCD的封裝   常常使用  掌握)

NSThread 我的接觸到的有3種開啓線程的方法:

a, 實例化NSThread類對象,而後調用對象的start方法,手動開啓子線程;注:程序猿無需關閉線程,在線程的任務執行完畢後,系統會自動關閉線程。

b,使用類方法 「detach...」來開啓子線程,不用手動開啓,線程自動啓動;

c,隱式開啓「perform...」,一樣不須要手動開啓,線程自動啓動;

GCD

在瞭解GCD以前,咱們須要先了解「隊列」和「任務」這連個概念;

GCD有一個機制叫:「隊列分發機制」;遵循「FIFO--先進先出,後進後出」;

GCD的框架:lib_dispatch庫;

使用步驟:建立隊列,而後將任務添加到隊列中(上代碼:):

//「異步函數 + 併發隊列」
    //1,建立隊列(DISPATCH_QUEUE_SERIAL--串行隊列、DISPATCH_QUEUE_CONCURRENT--併發隊列)
    dispatch_queue_t queue = dispatch_queue_create("queue_1", DISPATCH_QUEUE_CONCURRENT);
    
    //2,將任務添加到隊列(同步函數dispatch_sync:,異步函數:dispatch_async)
    dispatch_async(queue, ^{
        NSLog(@"-------------%@",[NSThread currentThread]);//任務
    });


    //「同步函數+併發隊列」
    dispatch_queue_t queue_2 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_sync(queue_2, ^{
        NSLog(@"-------------%@",[NSThread currentThread]);//任務
    });

    //異步函數+串行隊列
    dispatch_queue_t queue_3 = dispatch_queue_create("queue_3", DISPATCH_QUEUE_SERIAL);
    dispatch_async(queue_3, ^{
        for (int i = 0; i<10000; i++) {
            NSLog(@"=====%d",i);
        }
         NSLog(@"1-------------%@",[NSThread currentThread]);
    });
    dispatch_async(queue_3, ^{
         NSLog(@"2-------------%@",[NSThread currentThread]);
    });
    dispatch_async(queue_3, ^{
         NSLog(@"3-------------%@",[NSThread currentThread]);
    });

建立隊列的幾個函數:

dispatch_queue_create(能夠建立併發隊列、也能夠建立串行隊列);

全局隊列--dispatch_get_global_queue( "隊列優先級" ,  0  );(默認爲併發隊列,當有多個隊列時候,隊列的優先級纔會體現出來)。

主隊列--dispatch_get_main_queue,特殊的串行隊列,主隊列中的任務都會在主線程中執行;

線程阻塞問題!!!--使用sync函數往當前的串行隊列添加任務,會卡住當前的串行隊列。

//線程卡住,nslog函數不會執行
    dispatch_queue_t queue_4 = dispatch_get_main_queue();
    dispatch_sync(queue_4, ^{
        NSLog(@"2-------------%@",[NSThread currentThread]);
    });

 

 

以上僅爲我的理解,如有不對的地方,望你們指出,謝謝。

相關文章
相關標籤/搜索