<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ## 一:創建和啟動線程的三種方式 **1.先創建后啟動** ~~~ // 創建 NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(download:) object:nil]; // 啟動 [thread start]; ~~~ **2.創建完自動啟動** ~~~ [NSThread detachNewThreadSelector:@selector(download:) toTarget:self withObject:nil]; ~~~ **3.隱式創建,自動啟動** ~~~ [self performSelectorInBackground:@selector(download:) withObject:nil]; ~~~ 后面兩種創建方式簡單快捷,但是無法對線程進行詳細的設置 ##二:方法 **1.常用方法** ~~~ //獲得當前線程 + (NSThread *)currentThread; //獲得主線程 + (NSThread *)mainThread; // 是否為主線程 + (BOOL)isMainThread; //睡眠(暫停)線程,進入阻塞狀態 + (void)sleepUntilDate:(NSDate *)date; + (void)sleepForTimeInterval:(NSTimeInterval)ti; //設置線程的名字 - (void)setName:(NSString *)n; - (NSString *)name; //強制停止線程,進入死亡狀態.一旦線程停止(死亡)了,就不能再次開啟任務 + (void)exit; ~~~ **2.線程調度優先級** ~~~ //線程的調度優先級 調度優先級的取值范圍是0.0 ~ 1.0,默認0.5,值越大,優先級越高 + (double)threadPriority; + (BOOL)setThreadPriority:(double)p; - (double)threadPriority; - (BOOL)setThreadPriority:(double)p; ~~~ ## 三:線程生命周期中的狀態 啟動線程?進入就緒狀態 -> 運行狀態。當線程任務執行完畢,自動進入死亡狀態 - (void)start;? ~~~ 阻塞(暫停)線程 ??進入阻塞狀態 + (void)sleepUntilDate:(NSDate *)date; + (void)sleepForTimeInterval:(NSTimeInterval)ti; 強制停止線程 ?進入死亡狀態 + (void)exit; ~~~ 注意:一旦線程停止(死亡)了,就不能再次開啟任務 ![](https://box.kancloud.cn/2016-03-07_56dd400fcb279.jpg) ##四:多線程安全隱患。 **1.安全隱患:** 1塊資源可能會被多個線程共享,也就是多個線程可能會訪問同一塊資源。比如多個線程訪問同一個對象、同一個變量、同一個文件 當多個線程訪問同一塊資源時,很容易引發數據錯亂和數據安全問題. **2.安全隱患解決 – 互斥鎖(即線程同步):** 互斥鎖使用格式 @synchronized(鎖對象) { // 需要鎖定的代碼 ?} 注意:鎖定1份代碼只用1把鎖,用多把鎖是無效的 **3.互斥鎖的優缺點:** 優點:能有效防止因多線程搶奪資源造成的數據安全問題 缺點:需要消耗大量的CPU資源 **4.相關專業術語:線程同步** 線程同步的意思是:多條線程在同一條線上執行(按順序地執行任務) 互斥鎖,就是使用了線程同步技術 **5.擴展(原子和非原子屬性):** OC在定義屬性時有nonatomic和atomic兩種選擇 atomic:原子屬性,為setter方法加鎖(默認就是atomic) nonatomic:非原子屬性,不會為setter方法加鎖 nonatomic和atomic對比 atomic:線程安全,需要消耗大量的資源 nonatomic:非線程安全,適合內存小的移動設備 iOS開發的建議: 所有屬性都聲明為nonatomic 盡量避免多線程搶奪同一塊資源 盡量將加鎖、資源搶奪的業務邏輯交給服務器端處理,減小移動客戶端的壓力 ##五:線程間通信。 **1.什么叫做線程間通信** 在1個進程中,線程往往不是孤立存在的,多個線程之間需要經常進行通信 **2.線程間通信的體現** 1個線程傳遞數據給另1個線程 在1個線程中執行完特定任務后,轉到另1個線程繼續執行任務 **3.線程間通信常用方法** ~~~ - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait; - (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait; ~~~ ~~~ - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait; ~~~ 在主線程上執行指定的方法,使用默認的模式(NSDefaultRunLoopMode)。默認的模式指:主線程中的方法進行排隊,是一個循環隊列,并且循環執行。 參數: aSelector:要在主線程執行的方法,該方法不能有返回值,并且只能有一個參數。 arg:要傳遞的參數,如果無參數,就設為nil wait:要執行的aSelector方法,是否馬上執行。如果設置為YES:等待當前線程執行完以后,主線程才會執行aSelector方法;設置為NO:不等待當前線程執行完,就在主線程上執行aSelector方法。如果,當前線程就是主線程,那么aSelector方法會馬上執行。 `- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait; ` 在當前線程中執行指定的方法,使用默認模式,并指定延遲。 參數: aSelector:要在主線程執行的方法,該方法不能有返回值,并且只能有一個參數。 anArgument:要傳遞的參數,如果無參數,就設為nil delay:指定延遲時間(秒)。 線程通訊例子--下載圖片 ![](https://box.kancloud.cn/2016-03-07_56dd400feea7f.jpg)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看