- 1.进程和线程
什么是进程?
进程当用户下达执行应用程序命令时,所启动的东西。
什么是线程?
线程是进程的执行单位,比喻线程是工厂里的工人,而进程比作是工厂
- 2. 多线程
为了更好的进行一些程序的操作,节省时间,提高效率。
一个进程不能过多的创建线程,资源消耗太大(工厂能有太多的工人,工资不可以发太多)开辟5个左右的线程就可以。
注意:所有的UI的操作,都放在主线程中进行,
需要开辟线程的耗时操作,包括图像文字渲染,大数据存储。网络请求等。
## iOS线程下 NSThread
1> currentThread 获取当前线程
NSThread *thread = [NSThread currentThread];
打印结果:<NSThread: 0x7fad10603a40>{number = 1, name = main}
name代表线程名字
number 线程编号
main 代表主线程
2> 开辟个子线程
子线程随机创建
[NSThread detachNewThreadSelector:@selector(detachNewThread) toTarget:self withObject:nil];
打印线程随机创建
3> 延迟当前的线程执行,固定日期
NSDate *date = [NSDate dateWithTimeIntervalSinceNow:10];
[NSThread sleepUntilDate:date];
延迟10 s
4> 相对时间
[NSThread sleepForTimeInterval:1];
5> exit 退出当前线程, 不要退出主线程
退出后线程后续操作不会再执行,
[NSThread exit];
6> priority 线程的优先级
默认线程优先级都为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{
//请求数据NSData data= [self requestData];
/将数据显示到UI控件,注意只能在主线程中更新UI,另外performSelectorOnMainThread方法是NSObject的分类方法,每个NSObject对象都有此方法,它调用的selector方法是当前调用控件的方法,例如使用UIImageView调用的时候selector就是
UIImageView的方法Object:代表调用方法的参数,不过只能传递一个参数(如果有多个参数请使用对象进行封装)waitUntilDone:是否线程任务完成执行 */
[self performSelectorOnMainThread:@selector(updateImage:) withObject:data waitUntilDone:YES];
}
pragma mark 多线程下载图片-(void)loadImageWithMultiThread{
//方法1:使用对象方法//创建一个线程,第一个参数是请求的操作,第二个参数是操作方法的参数// NSThread *thread=[[NSThread alloc]initWithTarget:self selector:@selector(loadImage) object:nil];
启动一个线程,注意启动一个线程并非就一定立即执行,而是处于就绪状态,当系统调度时才真正执行
[thread start];
//方法2:使用类方法
[NSThread detachNewThreadSelector:@selector(loadImage) toTarget:self withObject:nil];
}
##GCD
1> GCD 全称是Grand central dispatch
2> GCD 核心概念队列, 管理任务拆分分配到队里中,系统会自动为我们创建线程和调度线程,自动。
3> GCD 中的队列严格遵循fifo(先进先出)法则
对列分为
1>串行DISPATCH_QUEUE_SERIAL / NULL
2>并行DISPATCH_QUEUE_CONCURRENT
4> 队列的创建
串行
自己创建的队列
dispatch_queue_t queue = dispatch_queue_create("queue", NULL);
并行
系统提供的队列
dispatch_queue_t queue2 = dispatch_queue_create("queue1", DISPATCH_QUEUE_CONCURRENT)
主队列是串行
dispatch_queue_t queue3 = dispatch_get_main_queue();
全局队列
参数1. 调度队列优先级
参数2. 给未来使用,占位使用默认填0
dispatch_queue_t global = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
术语:
串行,一个任务执行完成,在执行下个任务
并发,多个任务同时执行
同步 串行队列(不会创建线程)
同步 在当前线程做时,不能开辟线程
异步 在新创建的线程做事, 执行任务,可以开辟线程
同步串行队列 不会创建线程
串发 创建一条新的线程, 在改线程中执行任务
并发 根据任务决定需要创建多少线程
同步 并发(不会创建线程)
同步主线程(不会执行)
主线程等待同步操作结束,同步操作在主线程执行,互相等待 同步主线程,导致程序卡死
同步全局队列(不会创建线程)并发的;
希望可以帮助大家
讨论iOS技术、提些意见➕QQ : 251099939
在线解答