- 1.進程和線程
什么是進程?
進程當用戶下達執(zhí)行應用程序命令時,所啟動的東西。
什么是線程?
線程是進程的執(zhí)行單位,比喻線程是工廠里的工人,而進程比作是工廠
- 2. 多線程
為了更好的進行一些程序的操作,節(jié)省時間,提高效率。
一個進程不能過多的創(chuàng)建線程,資源消耗太大(工廠能有太多的工人,工資不可以發(fā)太多)開辟5個左右的線程就可以。
注意:所有的UI的操作,都放在主線程中進行,
需要開辟線程的耗時操作,包括圖像文字渲染,大數(shù)據(jù)存儲。網(wǎng)絡請求等。
## iOS線程下 NSThread
1> currentThread 獲取當前線程
NSThread *thread = [NSThread currentThread];
打印結果:<NSThread: 0x7fad10603a40>{number = 1, name = main}
name代表線程名字
number 線程編號
main 代表主線程
2> 開辟個子線程
子線程隨機創(chuàng)建
[NSThread detachNewThreadSelector:@selector(detachNewThread) toTarget:self withObject:nil];
打印線程隨機創(chuàng)建
3> 延遲當前的線程執(zhí)行,固定日期
NSDate *date = [NSDate dateWithTimeIntervalSinceNow:10];
[NSThread sleepUntilDate:date];
延遲10 s
4> 相對時間
[NSThread sleepForTimeInterval:1];
5> exit 退出當前線程, 不要退出主線程
退出后線程后續(xù)操作不會再執(zhí)行,
[NSThread exit];
6> priority 線程的優(yōu)先級
默認線程優(yōu)先級都為0.5
double priority = [NSThread threadPriority];
NSLog(@"%lf", priority);
double 類型
7> isMainThread 判斷是否是主線程
判斷當前線程是不是主線程
[NSThread isMainThread];
判斷線程對象是不是主線程
[[NSThread mainThread] isMainThread];
8> 初始化方法
初始化一個未啟動的線程
需要手動管理線程
NSThread *newThread = [[NSThread alloc] initWithTarget:self selector:@selector(newThread1) object:nil];
[newThread start];
注意:子線程加載完成后一定要返回主線程顯示
返回主線程方法:performSelectorOnMainThread
*#pragma mark 加載圖片-(void)loadImage{
//請求數(shù)據(jù)NSData data= [self requestData];
/將數(shù)據(jù)顯示到UI控件,注意只能在主線程中更新UI,另外performSelectorOnMainThread方法是NSObject的分類方法,每個NSObject對象都有此方法,它調用的selector方法是當前調用控件的方法,例如使用UIImageView調用的時候selector就是
UIImageView的方法Object:代表調用方法的參數(shù),不過只能傳遞一個參數(shù)(如果有多個參數(shù)請使用對象進行封裝)waitUntilDone:是否線程任務完成執(zhí)行 */
[self performSelectorOnMainThread:@selector(updateImage:) withObject:data waitUntilDone:YES];
}
pragma mark 多線程下載圖片-(void)loadImageWithMultiThread{
//方法1:使用對象方法//創(chuàng)建一個線程,第一個參數(shù)是請求的操作,第二個參數(shù)是操作方法的參數(shù)// NSThread *thread=[[NSThread alloc]initWithTarget:self selector:@selector(loadImage) object:nil];
啟動一個線程,注意啟動一個線程并非就一定立即執(zhí)行,而是處于就緒狀態(tài),當系統(tǒng)調度時才真正執(zhí)行
[thread start];
//方法2:使用類方法
[NSThread detachNewThreadSelector:@selector(loadImage) toTarget:self withObject:nil];
}
##GCD
1> GCD 全稱是Grand central dispatch
2> GCD 核心概念隊列, 管理任務拆分分配到隊里中,系統(tǒng)會自動為我們創(chuàng)建線程和調度線程,自動。
3> GCD 中的隊列嚴格遵循fifo(先進先出)法則
對列分為
1>串行DISPATCH_QUEUE_SERIAL / NULL
2>并行DISPATCH_QUEUE_CONCURRENT
4> 隊列的創(chuàng)建
串行
自己創(chuàng)建的隊列
dispatch_queue_t queue = dispatch_queue_create("queue", NULL);
并行
系統(tǒng)提供的隊列
dispatch_queue_t queue2 = dispatch_queue_create("queue1", DISPATCH_QUEUE_CONCURRENT)
主隊列是串行
dispatch_queue_t queue3 = dispatch_get_main_queue();
全局隊列
參數(shù)1. 調度隊列優(yōu)先級
參數(shù)2. 給未來使用,占位使用默認填0
dispatch_queue_t global = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
術語:
串行,一個任務執(zhí)行完成,在執(zhí)行下個任務
并發(fā),多個任務同時執(zhí)行
同步 串行隊列(不會創(chuàng)建線程)
同步 在當前線程做時,不能開辟線程
異步 在新創(chuàng)建的線程做事, 執(zhí)行任務,可以開辟線程
同步串行隊列 不會創(chuàng)建線程
串發(fā) 創(chuàng)建一條新的線程, 在改線程中執(zhí)行任務
并發(fā) 根據(jù)任務決定需要創(chuàng)建多少線程
同步 并發(fā)(不會創(chuàng)建線程)
同步主線程(不會執(zhí)行)
主線程等待同步操作結束,同步操作在主線程執(zhí)行,互相等待 同步主線程,導致程序卡死
同步全局隊列(不會創(chuàng)建線程)并發(fā)的;
希望可以幫助大家
討論iOS技術、提些意見?QQ : 251099939
在線解答