## 一:創建和啟動線程的三種方式
**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;
~~~
注意:一旦線程停止(死亡)了,就不能再次開啟任務

##四:多線程安全隱患。
**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:指定延遲時間(秒)。
線程通訊例子--下載圖片

- 前言
- iOS開發實踐之SQLite3
- iOS開發實踐之FMDB
- Obj-C與javascript交互之WebViewJavascriptBridge
- iOS開發實踐之UIWebView
- iOS開發實踐之多線程(基本概念)
- iOS開發實踐之多線程(NSThread)
- iOS開發實踐之多線程(GCD)
- iOS開發實踐之多線程(單例模式)
- iOS開發實踐之xib加載注意問題
- iOS開發實踐之多線程(NSOperation)
- iOS開發實踐之cell下載圖片(NSOperation)
- iOS開發實踐之cell下載圖片(自定義NSOperation)
- iOS開發實踐之cell下載圖片(SDWebImage)
- iOS開發實踐之JSON
- iOS開發實踐之XML
- iOS開發實踐之GET和POST請求
- iOS開發實踐之網絡檢測Reachability
- iOS開發實踐之MD5加密