程序:由源代码生成的可执行应用.
进程:一个正在运行的程序,进程拥有独立运行所需的全部资源;
由一个或多个线程组成;
进程只负责资源的调度和分配,线程才是程序的真正执行单元,负责代码的执行
线程:程序中独立运行的代码段.(单线程/多线程)
只有并行
每个进程,至少包含一个线程,这个线程被称为主线程
主线程在同一时间只能干一件事,主线程尽量只用于展示(iOS中关于UI的添加和刷新必须在主线程中操作)
只有一个主线程的程序,称为单线程程序.
拥有多个线程的程序,称作多线程程序
[NSThread currentThread]获取当前的线程
[NSThread mainThread]获取主线程
[NSThread isMainThread]判断当前线程是否为主线程
****开辟子线程的三种方法
//NSObject开辟子线程
[self performSelectorInBackground: @selector(sayHi)withObject:@"aaa"];
//NSThread手动开辟子线程
NSThread *thread = [[NSThreadalloc]initWithTarget: self selector:@selector(sayHi) object:nil];
//让线程开始执行
[thread start];
//取消线程不会真正的取消掉线程,而是标记这个被取消了
[thread cancel];
//NSThread自动的去开辟一个子线程(子线程不能进行增删改的操作)
//使用NSThread自动的开辟一个线程
//不需要手动的开启线程
[NSThread detachNewThreadSelector:@selector(sayHi)toTarget:self withObject:nil];
//NSObject中回到主线程去做某些事情
[self performSelectorOnMainThread:@selector(onMainThread)withObject:nil waitUntilDone:YES];
创建NSOperation的方法有两个
//第一个
//通过NSInvocationOperation类来创建一个NSOperation对象(使用初始化方法)
NSInvocationOperation*operation = [[NSInvocationOperation alloc]initWithTarget:selfselector:@selector(hehehe)object:nil];
//第二个
//使用NSBlockOperation类来创建一个NSOperation对象(使用便利构造器的方法)
NSBlockOperation*blockoperation
= [NSBlockOperation blockOperationWithBlock:^{.........}];
***两个方法如果分别单独使用的时候要调用[operation start];
//创建一个队列管理器的方法(两种)
NSOperationQueue是一个队列管理器,可以根据operation任务自己分配线程,自己管理线程的生命周期
//在开发中,不需要管理线程的创建和销毁
//第一种
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
//第二种
//获取系统提供的主队列
NSOperationQueue*mainQueue = [NSOperationQueue mainQueue];
//把operation对象添加到队列管理器当中,不用调用开始的方法
[queue addOperation:blockoperation];
[queue addOperation:operation];
//给两个任务添加依赖关系,这两个任务就会按照依赖关系顺序进行
[operation addDependency:blockoperation];
//最大线程并发数
// maxConcurrentOperationCount表示同时执行任务的最大数量
//即使只执行一个任务,系统有的时候也会开辟多个线程去执行这个任务
quew.maxConcurrentOperationCount= 1;
//GCD获取串行和并行的方法各有俩个
*****创建一个串行的队列
//使用系统提供的一个串行的队列(主队列)
dispatch_queue_tqueue = dispatch_get_main_queue();
//自定义创建一个串行队列
//第一个参数:系统提供一个宏
//第二个参数:系统保留字段0
dispatch_queue_t queue = dispatch_queue_create(DISPATCH_QUEUE_SERIAL, 0);
*****创建一个并行的队列
//第一种获取系统提供的并行队列
dispatch_queue_t queue =
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);
//自己创建一个并行队列
dispatch_queue_t queue = dispatch_queue_create ("myQueue",DISPATCH_QUEUE_CONCURRENT);
创建分组
//创建分组
dispatch_group_t group = dispatch_group_create();
//创建一个队列()
dispatch_queue_t queue = dispatch_queue_create ("myQueue",DISPATCH_QUEUE_CONCURRENT);
//向分组中添加一个任务
dispatch_group_async(group, queue, ^{
NSLog(@"第一个任务");
});
//向分组中添加结束任务([不要讲结束任务放在第一个位置])
dispatch_group_notify(group, queue, ^{
NSLog(@"我是最后一个");
});
dispatch_group_async(group, queue, ^{
NSLog(@"第二个任务");
});
表示几秒后做某事
//dispatch_after(dispatch_time(DISPATCH_TIME_NOW,
(int64_t)(3.f*NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
//NSLog(@"死去时快快快");
//});
重复的向一个队列中添加一系列的任务
dispatch_queue_t queue = dispatch_queue_create(0,
DISPATCH_QUEUE_SERIAL);