1. 程式人生 > >iOS多執行緒的初步研究(一)-- NSThread

iOS多執行緒的初步研究(一)-- NSThread

對於多執行緒的開發,iOS系統提供了多種不同的介面,先談談iOS多執行緒最基礎方面的使用。產生執行緒的方式姑且分兩類,一類是顯式呼叫,另一類是隱式呼叫。

一、顯示呼叫的類為NSThread。一般構造NSThread的執行緒物件可通過兩種方式:

1. 初始化執行緒主方法:

[NSThread detachNewThreadSelector:@selector(run:) toTarget:target withObject:obj];//類方法

NSThread *newThread = [[NSThread alloc] initWithTarget:target selector:@selector(run:) object:obj];

//例項方法可以拿到執行緒物件,便於以後終止執行緒。

2. 定義NSThread的子類MyThread,然後實現main方法(即方法1中的run)。然後建立新物件:

MyThread *newThread = [[MyThread alloc] init];

啟動執行緒:[newThread start];

終止執行緒:實際上沒有真正提供終止執行緒的api,但有個cancel方法可以利用; 它改變執行緒執行的一個狀態標誌,我們可以這樣來利用:

先在run:或main方法中這樣實現執行緒迴圈:

- (void)main

{

    // thread init

    while (![[

NSThread currentThreadisCancelled])

    {

        // thread loop

        [NSThread sleepForTimeInterval:1.0]; //等同於sleep(1);

    }

    // release resources of thread

}

 這時如果呼叫[newThread cancel]; 就可以終止執行緒迴圈了。

 NSThread有個類方法exit是用於立即結束當前執行緒的執行(不安全),因為無法保證當前執行緒對資源的釋放,所以不推薦使用。像java中Thread的stop方法也被棄用一樣,因為不安全。

二、隱式呼叫

通過NSObject的Category方法呼叫,羅列如下:

- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait; //在主執行緒中執行方法,wait表示是否阻塞這個方法的呼叫,如果為YES則等待主執行緒中執行方法結束。一般可用於在子執行緒中呼叫UI方法。

- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait; //在指定執行緒中執行,但該執行緒必須具備run loop。

- (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg; //隱含產生新執行緒。


三、NSThread的其它一些常用的方法

建立的執行緒是非關聯執行緒(detached thread),即父執行緒和子執行緒沒有執行依賴關係,父執行緒結束並不意味子執行緒結束。

1. + (NSThread *)currentThread; //獲得當前執行緒

2. + (void)sleepForTimeInterval:(NSTimeInterval)ti; //執行緒休眠

3. + (NSThread *)mainThread; //主執行緒,亦即UI執行緒了

4. - (BOOL)isMainThread; + (BOOL)isMainThread; //當前執行緒是否主執行緒

5. - (BOOL)isExecuting; //執行緒是否正在執行

6. - (BOOL)isFinished; //執行緒是否已結束

四、一些非執行緒呼叫(NSObject的Category方法)

即在當前執行緒執行,注意它們會阻塞當前執行緒(包括UI執行緒):

- (id)performSelector:(SEL)aSelector;

- (id)performSelector:(SEL)aSelector withObject:(id)object;

- (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2;

 以下呼叫在當前執行緒延遲執行,如果當前執行緒沒有顯式使用NSRunLoop或已退出就無法執行了,需要注意這點:

- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay inModes:(NSArray *)modes;

- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay;

而且它們可以被終止:

+ (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget selector:(SEL)aSelector object:(id)anArgument;

+ (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget;

五、執行緒執行順序

通常UI需要顯示網路資料時,可以簡單地利用執行緒的執行順序,避免顯式的執行緒同步:

1. UI執行緒呼叫

[threadObjperformSelectorInBackground:@selector(loadData) withObject:nil];

2. 子執行緒中回撥UI執行緒來更新UI

- (void)loadData

{

    //query data from network

    //update data model

    //callback UI thread

    [uiObj performSelectorOnMainThread:@selector(updateUI) withObject:nil waitUntilDone:YES];

}

也可以使用NSThread實現同樣的功能,loadData相當於NSThread的main方法。

相關推薦

iOS執行初步研究-- NSThread

對於多執行緒的開發,iOS系統提供了多種不同的介面,先談談iOS多執行緒最基礎方面的使用。產生執行緒的方式姑且分兩類,一類是顯式呼叫,另一類是隱式呼叫。 一、顯示呼叫的類為NSThread。一般構造NSThread的執行緒物件可通過兩種方式: 1. 初始化執行緒主方法: [NSThread detach

iOS 執行初步研究-NSThread

對於多執行緒的開發,iOS系統提供了多種不同的介面,先談談iOS多執行緒最基礎方面的使用。產生執行緒的方式姑且分兩類,一類是顯式呼叫,另一類是隱式呼叫。 一、顯示呼叫的類為NSThread。一般構造NSThread的執行緒物件可通過兩種方式: 1. 初始化執行緒主方法: [NSThread deta

執行詳解

[多執行緒詳解(一)](http://www.neilx.com) 一、概念準備 1、程序 (1)直譯:正在進行中的程式 (2)解釋:執行一個程式時,會在記憶體中為程式開闢空間,這個空間就是一個程序。 (3)注意:一個程序中不可能沒有執行緒,只有有了執行緒才能執行; 程序只

執行學習總結

一、程序和執行緒的定義 程序:程序是資源(CPU、記憶體等)分配的基本單位,它是程式執行時的一個例項。程式執行時系統就會建立一個程序,併為它分配資源,然後把該程序放入程序就緒佇列,程序排程器選中它的時候就會為它分配CPU時間,程式開始真正執行。 執行緒:執行緒是程式執行時的最小單位,它是程序

Java執行-基礎篇

多執行緒---基礎篇,本文主要針對多執行緒的基礎進行復習,內容包括執行緒的理解,建立方式,Thread類函式理解; 1、執行緒的理解:OS系統角度:每個執行的程式都會被作業系統建立對應的程序(包括分配的資源、PCB等),程序是作業系統分配資源的基本單位(理解:程式執行需要空間,作業系統建立對應程序時

Java面向物件與執行綜合實驗之封裝、繼承與

編寫一個程式,實現檔案管理系統中的使用者管理模組。要求模組中實現使用者的模擬登入過程。通過使用者輸入,獲取使用者名稱和口令;與事先記錄在程式中的使用者資訊進行對比,通過口令驗證後才能使用系統。使用者分為系統管理人員、檔案錄入人員,檔案瀏覽人員三類,相關類圖如下所示。 (1)要求在使用者類中

執行學習筆記

一. 新建執行緒(兩種方法) 第一種:繼承Thread 1.定義一個類繼承Thread 2.該類重寫run方法。其中的getName是獲取執行緒名方法;有參構造可以在新建時指定執行緒名 3.建立子類物件就是建立新執行緒 4.子類物件呼叫start方法 ,開啟執行

Java執行學習筆記之中斷中的Interrupt,interrupted(),isInterrupted()

1、關於中斷 在Java中中斷最初是通過stop()來終止執行緒的,後來發現這樣簡單粗暴的停止執行緒會產生很多問題(例如物件monitor的釋放),所以改為deprecated,推薦使用interrupt()來中斷執行緒。而對於執行緒來說,會持有一個inter

Java執行與併發

多執行緒與併發的基礎問題 併發就是指程式同時處理多個任務的能力(一個程式被多個使用者訪問都能看到自己預期的結果) 併發的根源在於對多工情況下訪問資源的有效控制! 併發背後的問題 public class DownloadSimple {

Java執行乾貨系列—Java執行基礎

多執行緒併發程式設計是Java程式設計中重要的一塊內容,也是面試重點覆蓋區域,所以學好多執行緒併發程式設計對我們來說極其重要,下面跟我一起開啟本次的學習之旅吧。 正文 執行緒與程序 1 執行緒:程序中負責程式執行的執行單元 執行緒本身依靠程式進行執行 執行緒是程式中的順序控制流,只能使用分配給程式的資源和環

執行基礎知識 執行的概念及建立任務與執行

執行緒的概念及建立任務與執行緒 引言 多執行緒使得程式中的多個任務可以同時執行。 java的重要功能之一就是內部支援多執行緒————在一個程式中運行同時執行多個任務。在許多程式設計語言中,多執行緒都是通過呼叫依賴於系統的過程或函式來實現的。在本文中,將介紹執行緒的該

Java執行--Monitor物件

1. 什麼是Monitor?     Monitor其實是一種同步工具,也可以說是一種同步機制,它通常被描述為一個物件,主要特點是: 物件的所有方法都被“互斥”的執行。好比一個Monitor只有一個執行“許可”,任一個執行緒進入任何一個方法都需要獲得這個“許可”,離開時

【JAVA秒會技術之玩轉執行執行那些事兒

多執行緒那些事兒(一) 現在只要出去面試,關於“Java多執行緒”的問題,幾乎沒有一家單位不問的,可見其重要性。於是博主抽空研究了一下,確實很有意思!以下是我綜合整理了網上的各種資料,和個人的一些理解,寫的一篇總結博文,僅供學習、交流。 (一)多執行緒的概念      

Qt執行程式設計總結

Qt對執行緒提供了支援,基本形式有獨立於平臺的執行緒類、執行緒安全方式的事件傳遞和一個全域性Qt庫互斥量允許你可以從不同的執行緒呼叫Qt方法。 這個文件是提供給那些對多執行緒程式設計有豐富的知識和經驗的聽眾的。推薦閱讀: 警告:所有的GUI類(比如,QWidget和它的

Qt執行程式設計總結所有GUI物件都是執行不安全的

Qt對執行緒提供了支援,基本形式有獨立於平臺的執行緒類、執行緒安全方式的事件傳遞和一個全域性Qt庫互斥量允許你可以從不同的執行緒呼叫Qt方法。 這個文件是提供給那些對多執行緒程式設計有豐富的知識和經驗的聽眾的。推薦閱讀: 警告:所有的GUI類(比如,QWidget和它的子類),作業系統核心類(比如,QPr

對於java執行的理解

解釋:程序的顆粒度太大,每次都要有上下的調入,儲存,調出。如果我們把程序比喻為一個執行在電腦上的軟體,那麼一個軟體的執行不可能是一條邏輯執行的,必定有多個分支和多個程式段,就好比要實現程式A,實際分成 a,b,c等多個塊組合而成。那麼這裡具體的執行就可能變成:程式A得到CPU =》CPU載入上下文,開始執行程

執行基本內容

一、執行緒建立方式 1、繼承thread類     ①、定義一個執行緒子類     ②、重寫thread的run     ③、例項化一個物件,呼叫star()方法  public class java

執行併發庫

ThreadLocal 是執行緒區域性變數。在多執行緒中,實現每個執行緒中變數的私有性。 例子一 在該例子中,在同一個執行緒中通過呼叫類A和類B的getData()方法獲取的資料是一致的。 public class ThreadLocalTest {

.net 4.0 中對執行新特性

      在.net 40中對多執行緒的處理增加了很多新的類以方便多執行緒環境下的程式設計實現,首先需要了解的是兩個非常有用的類Lazy<T>和ThreadLazy<T>,通過這兩個類我們可以很方便實現一個單例模式而不用考慮太多的執行緒安全的問題。

c++執行重點難點interlocked系列原子操作

_beginthreadex()函式在建立新執行緒時會分配並初始化一個_tiddata塊。這個_tiddata塊自然是用來存放一些需要執行緒獨享的資料。事實上新執行緒執行時會首先將_tiddata塊與自己進一步關聯起來。然後新執行緒呼叫標準C執行庫函式如st