程序: 可执行文件
进程: 一个正在运行的可执行文件, 每个进程都有独立的虚拟内存空间和系统资源, 包含至少一个主线程和任意数量的辅助线程, 而且, 当一个进程的主线程退出时, 这个进程就结束了
线程: 一个独立代码执行路径, 由线程做资源的分配和调度
iOS创建线程的方式:
----------------------------------------------------------------------------------------------------------------------------------------------------------
a. NSObject
//调用此方法, 执行的操作(方法)在后台进程中执行
[self performSelectorInBackground:@selector(serverPro:) withObject:@"你好"];
----------------------------------------------------------------------------------------------------------------------------------------------------------b. NSThread
NSThread, 线程类, 继承与NSObject
//开辟一个子线程
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(serverPro:) object:nil];
//常用的一些方法
NSThread *mainThread = [NSThread mainThread];
//获取当前代码执行的线程
NSThread *currentThread = [NSThread currentThread];
//线程休眠
[NSThread sleepForTimeInterval:5];
//主线程和子线程的区别
//1. 能够分配的资源的最大容量不同, 主线程10MB, 子线程5MB
//2. 子线程不会释放autorelease的对象, 需要手动添加自动释放池
//3. 更新UI的操作必须在主线程中执行
-------------------------------------------------------------------------------------
队列结构: 先进先出
//NSOperation, 任务(操作)类, 继承于NSObject, 是抽象基类, 其子类: NSInvocationOperation or NSBlockOperation
//子类:
//NSInvocationOperation
//NSBlockOperation
//串行, 并发, 主要的区别在于同时执行的任务的数量
//串行: 一次只能执行一个任务, 并且必须等上一个任务执行完, 才能执行下一个任务
//并发: 允许多个任务同时执行
//创建任务
//任务只能够执行一次, 已经添加到对列中, 就不能再添加
//任务1
NSInvocationOperation *invocation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(serverPro:) object:nil];
//任务2
NSBlockOperation *block = [NSBlockOperation blockOperationWithBlock:^{
for (NSInteger i = 1; i <= 100; i++) {
NSLog(@"%ld", i);
}
}];
//创建操作队列
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
//把任务放到队列中
[queue addOperation:invocation];
[queue addOperation:block];
d. GCD
GCD: Grand Central Dispatch, 大中央调度, 基于CPU的多核技术实现, 使用C语言的语法, 执行效率更高, NSOperationQueue就是基于GCD实现的
三种队列:
1> 主队列, 绑定主线程, 串行队列
dispatch_queue_t mainQueue = dispatch_get_main_queue();
2> 全局队列, 绑定的是子线程, 串行或并发
//参数1: 队列优先级
//参数2: 预留参数, 为未来做准备
dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
3> 自定义队列, 绑定子线程, 串行或并发
//参数1: 队列标识符, 域名
//参数2: 并发或串行
dispatch_queue_t custom = dispatch_queue_create("com.lanou3g.huihui", DISPATCH_QUEUE_CONCURRENT);
把操作放在队列的两种方式:
//同步执行
dispatch_sync(mainQueue, ^{
//写操作
[self serverPro:nil];
});
//异步执行
dispatch_async(globalQueue, ^{
[self serverPro:nil];
});
//多少秒后执行
//第一个参数: 秒数
//第二个参数: 多少秒后的操作
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"睡觉");
});