多線程

一個正在進行的應用程序 叫進程,一個進程 包括程序裏的所有資源
線程是進程的一部分.進程是給線程提供資源的
任何一個程序至少有一個線程,那個程序叫主線程
系統會爲線程分配 1兆的 棧空間
多線程是爲了執行 併發

線程: 執行任務(代碼)的單元
任務: 一個方法,代碼段
 1.什麼是線程同步?
 同步其實就是串行,線程2的執行依賴於線程1的結果.
 2.如何實現同步:
 建立一個NSOperationQueue,把它的線程最大值設爲1
 (方法: setMaxConcurrentOperationCount)

NSThread 線程類  isMainThread它的類方法,用來判斷這個線程是不是主線程
凡前面是is的都是布爾值 ,打印的值是1(是組線程)0

線程分兩種: 脫離線程 和 非脫離線程
    脫離線程: 執行完任務之後,自動銷燬的線程
    非脫離線程: 執行完任務之後,不會被銷燬的線程,可以後續執行別的任務
    主線程 是 非脫離線程
    每一個線程都自帶一個NSRunLoop對象,runloop默認是關閉的.一旦runloop開啓,你的線程就會成爲非脫離線程.runloop幫你輪詢有沒有新的任務分配到了這個線程裏面  
 實現多線程的方式一:
  使用 跟類 NSObject 中的 performSelecterXXX方法.
  UI的刷新一定要再主線程裏進行子線程刷新UI會異常,刷新不了,或者延遲刷新

   多線程 背後執行 XX方法   .它解決了想立即執行的問題
如:[self performSelectorInBackground:@selector(aa) withObject:nil];
實現多線程的方式二(脫離線程):
使用 NSThread 類
 二的第一個: 它解決了想立即執行的問題
創建一個線程並讓線程執行 self aa方法 
 [NSThread detachNewThreadSelector:@selector(aa) toTarget:self withObject:nil];
  [thread start]; 記得寫開始執行(可以自己決定什麼時候開始執行)
二的第二個:  它解決了想延遲執行的問題 ,就是在方法中調延遲方法,然後最外層的方法再被外界使用
NSThread *thread=[[NSThread alloc] initWithTarget:self selector:@selector(aa) object:nil];
[thread start]; 記得寫開始執行(可以自己決定什麼時候開始執行)
第三種實現多線程的方式:   NSOperationQueue 操作隊列    一個接口 調用的操作
  NSInvocationOperation(程序調用操作)  是一個操作,在需要的時候開闢. 它是一個線程操作,爲的是使用它來調一個可用的方法.所以在需要用到的時候添加即可. 然後再把它添加到NSOperationQueue對象上

 NSInvocationOperation *op1=[[NSInvocationOperation alloc] initWithTarget:self selector:@selector(aa) object:nil];    NSBlockOperation *op2=[NSBlockOperation blockOperationWithBlock:^{        NSLog(@"這是一個block operation");    }];     //NSInvocationOperation 是一個操作,在需要的時候,開闢    NSOperationQueue *queue=[[NSOperationQueue alloc] init];    [queue setMaxConcurrentOperationCount:1];//線程最大數
    [queue addOperation:op1]; //一旦把她加到NSOperationQueue,需要start  即:    [op1 start]










 但現在只需要把操作放到隊列裏即可,不需要人爲調用start,queue會根據op的排隊情況,幫你調用start.會智能爲op安排線程     [queue addOperation:op2];
第四種 實現多線程的方法是GCD

如果一個任務(方法)在子線程裏面執行,我們需要在任務裏面加自動釋放池
 原因: 因爲,線程與線程之間 相互獨立的.但是資源是共享的,共享 堆空間.如果子線程裏開闢了空間,沒有釋放.其他線程也無法使用這塊以及開闢的空間.  
尤其是當子線程裏大量使用便利構造器的時候,會導致很多堆空間無法回收內存
所有的autorelease只有遇到自動釋放池的時候纔會釋放,所以任何子線程都要加自動釋放池
線程 共享堆.棧不共享! 每個子線程默認的棧大小是512K.主線程棧大小是1M.棧主要是放 局部變量的,局部變量出了方法就會銷燬,因此,儘管只有512K或者1M但是以及夠用了.棧空間的大小 必須是4k的整數倍.

執行完子線程以後一定要回到主線程 ( 回到主線程 子線程通信)
方法:performSelectorOnMainThreadwithObjectwaitUntilDone:]; //waitUntilDone 等待結束 可以控制執行順序
如下: 在
@autoreleasepool {  如果在子線程裏面需要執行任務,一定要寫到自動釋放池裏面         NSLog(@"+++%d",[NSThread isMainThread]);         for (int i = 0; i < 1000; i++) {             NSLog(@"%d",i);         }         //回到主線程 子線程通信.執行完子線程以後一定要回到主線程         [self performSelectorOnMainThread:@selector(bb) withObject:nil waitUntilDone:YES]; //waitUntilDone 等待結束 可以控制執行順序         NSLog(@"子線程結束了");      } } 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章