一.線程和進程
進程::系統中正在運行的一個程序,每個程序獨立運行在自己特定的受保護的內存空間內。
從活動監視器上可以很直觀的看到正在運行的進程名稱,和占得CPU百分比。
線程:一個進程想要執行任務,必須有線程,每一個進程最少有一條線程。線程是進程的基本執行單元,一個進程的所有任務都在線程中執行。
可以看出有3個線程
二.線程的串行和并行
串行:在一個線程中執行多個任務,會按照順序一個一個去執行。在同一時間內,只會執行一個任務。
并行:在一個線程執行多個任務時,會同時執行多個不同的任務。
多線程的原理:同一時間,CPU只能處理一條線程,只有一條線程在執行。多線程執行,是CPU快速的在多線程之間調度。如果CPU調度線程的時間足夠快,就造成了多線程并發執行的假象。
三.多線程的優缺點
優點:能夠適當提高程序的執行效率,能適當的提高資源利用率(CPU,內存利用率)
缺點:開啟線程需要占用一定的內存空間(默認情況下,主線程占用1M,子線程占用512KB),如果大量開啟線程,會占用大量內存空間,降低程序的性能線程越多,CPU在調度線程的開銷就越大.程序設計會更加復雜,比如線程之間的通訊,多線程的數據共享。
四:多線程開發中的運用
在程序運行后會默認開啟一條線程,稱為主線程或UI線程,主要負責UI的刷新,處理UI事件.
而在子線程負責數據的加載處理。
主線程使用注意:耗時操作別放到主線程中,耗時操作會嚴重影響UI的流暢度,給用戶一種“卡”的體驗.
五.代碼示例:
我們在storyboard中拖入開關控件,或者滑動條控件.
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
}
- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent *)event{
[self performSelectorInBackground:@selector(longOperation) withObject:nil];
}
- (void)longOperation{
NSLog(@"start");
for (int i = 0; i < 1000000; ++i) {
NSLog(@"%d",i);
}
NSLog(@"end");
}
如果在主線程中調用longOperation方法,由于在方法中我們打印i的值.這個操作是耗時操作.會大量消耗CPU性能.當運行程序,我們點擊storyboard中的控件時,會發現控件沒有進行響應,給用戶“卡”的體驗.而當我們開啟子線程,將longOperation放入子線程中,再點擊控件時,控件進行響應動作.