轉載于翟乃玉大神以下的博客?
[http://blog.csdn.net/u013357243/article/details/45898443](http://blog.csdn.net/u013357243/article/details/45898443)
[http://blog.csdn.net/u013357243/article/details/45912585](http://blog.csdn.net/u013357243/article/details/45912585)
## 一:進程和線程
### 1:什么是進程
進程是指在系統中正在運行的一個應用程序?
每個進程之間是獨立的,每個進程均運行在其專用且受保護的內存空間內。

?
比如同時打開QQ、Xcode,系統就會分別啟動2個進程。
通過“活動監視器”可以查看Mac系統中所開啟的進程

### 2:什么是線程
1個進程要想執行任務,必須得有線程(每1個進程至少要有1條線程——主線程)。?
線程是進程的基本執行單元,一個進程(程序)的所有任務都在線程中執行。
比如使用酷狗播放音樂、使用迅雷下載電影,都需要在線程中執行。

### 3:線程的串行
1個線程中任務的執行是串行的?
如果要在1個線程中執行多個任務,那么只能一個一個地按順序執行這些任務?
也就是說,在同一時間內,1個線程只能執行1個任務
比如在1個線程中下載3個文件(分別是文件A、文件B、文件C)

## 二:多線程
### 1:什么是多線程
1個進程中可以開啟多條線程,每條線程可以并行(同時)執行不同的任務?
進程 ? 車間,線程 ? 車間工人?
多線程技術可以提高程序的執行效率
比如同時開啟3條線程分別下載3個文件(分別是文件A、文件B、文件C)

### 2:多線程的優缺點
#### (1)多線程的優點:
a:能適當提高程序的執行效率。?
b:能適當提高資源利用率(CPU、內存利用率)。
#### (2)多線程的缺點?
a:開啟線程需要占用一定的內存空間(默認情況下,主線程占用1M,子線程占用512KB),如果開啟大量的線程,會占用大量的內存空間,降低程序的性能。?
b:線程越多,CPU在調度線程上的開銷就越大。?
c:程序設計更加復雜:比如線程之間的通信、多線程的數據共享。
### 3:多線程安全隱患
#### (1):資源共享
一塊資源可能會被多個線程共享,也就是多個線程可能會訪問同一塊資源
比如多個線程訪問同一個對象、同一個變量、同一個文件
當多個線程訪問同一塊資源時,很容易引發數據錯亂和數據安全問題。
比如銀行存取問題:

賣票問題:

分析:

### 加鎖
這里加一個互斥鎖(同步鎖)就可以了,學過java的都應該了解鎖的概念吧。我就不多解釋了,這方面博客一堆堆的。

互斥鎖使用格式?
@synchronized(鎖對象) { // 需要鎖定的代碼 }?
注意:鎖定1份代碼只用1把鎖,用多把鎖是無效的
互斥鎖的優缺點?
優點:能有效防止因多線程搶奪資源造成的數據安全問題?
缺點:需要消耗大量的CPU資源
互斥鎖的使用前提:多條線程搶奪同一塊資源
相關專業術語:線程同步?
線程同步的意思是:多條線程在同一條線上執行(按順序地執行任務)?
互斥鎖,就是使用了線程同步技術
~~~
-(void)saleTicket{
while (1) {
@synchronized(self) {
int count = self.leftTicketCount;
if (count>0) {
[NSThread sleepForTimeInterval:0.05];
self.leftTicketCount = count - 1;
NSLog(@"%@窗口賣出一張票,還剩%d張票",[NSThread currentThread].name,self.leftTicketCount );
}else{
return;
}
}
}
}
~~~
## 三:多線程在iOS開發中的應用
### 1:什么是主線程
一個iOS程序運行后,默認會開啟1條線程,稱為“主線程”或“UI線程”。
(1)主線程的主要作用?
a:顯示\刷新UI界面。?
b:處理UI事件(比如點擊事件、滾動事件、拖拽事件等)。
(2)主線程的使用注意?
a:別將比較耗時的操作放到主線程中。?
b:耗時操作會卡住主線程,嚴重影響UI的流暢度,給用戶一種“卡”的壞體驗。
c:不要同時開太多的線程(1~3條線程即可,不要超過5條)
### 舉個栗子
如果將耗時操作放在主線程,假設某些耗時操作需要耗挺長時間的,然后我們操作了,在主線程中她就卡了10秒,這用戶體驗。。。。弱爆了。
代碼:
~~~
- (IBAction)btnClick {
// 1.獲得當前的線程
NSThread *current = [NSThread currentThread];
// 2.執行一些耗時操作
for (int i = 0; i<10000; i++) {
// 3.輸出線程
NSLog(@"%@", current);
}
}
~~~

當前執行分析:等待主線程串行執行。

### 解決方案:
開啟子線程。

### 2:線程間通信
### 什么叫做線程間通信
在1個進程中,線程往往不是孤立存在的,多個線程之間需要經常進行通信
**1:線程間通信的體現**
一個線程傳遞數據給另一個線程。?
在一個線程中執行完特定任務后,轉到另一個線程繼續執行任務。
**2:線程間通信常用方法**
~~~
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait;
~~~

## iOS中多線程的實現方案

- 前言
- 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加密