什么是线程
线程:是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
为什么使用多线程
多线程是一个比较轻量级的方法来实现单个应用程序内多个代码执行路径,也就是能够产生多条路径来执行代码块
三种多线程的编程方式
一.NSThread
NSThread有两种创建方法,一种是类方法,一种是实例方法,类方法创建的时候需要确定好执行的任务,没有任何返回,它会自己创建一个新线程去执行指定任务,而用实例方法则需要我们手动开启这个线程。创建的时候我们既可以使用SEL
也可以使用Block。
1.类方法
[NSThread detachNewThreadSelector:@selector(outPutLog:) toTarget:self withObject:@"类方法创建线程"];//这是使用SEL方法
[NSThread detachNewThreadWithBlock:^{
NSLog(@"用类方法创建线程成功");
}];//这是Block方法
2.实例方法
NSThread *thre=[[NSThread alloc] initWithTarget:self selector:@selector(outPutLog:) object:@"实例方法创建线程"];//这是使用SEL方法
NSThread *threa=[[NSThread alloc] initWithBlock:^{
NSLog(@"实例方法创建线程");
}];//这是Block方法
[thread start];//启动线程
[thre start];
3.另外一种创建线程的方式
[self performSelectorInBackground:@selector(outPutLog:) withObject:@"创建后台线程"];
二.GCD
Grand Central Dispatch (GCD)宏伟的中枢调度,是一种基于C语言的并发编程技术。它是苹果为多核的并行运算提出的解决方案,会自动调度系统资源,所以它的效率很高。
GCD并不直接操作线程,而是操作队列和任务。我们只需要把任务添加到队列里面,然后指定任务执行的方式,GCD就会自动调度线程执行任务
串行队列
dispatch_queue_t serialQuene = dispatch_queue_create( "my_serial_queue" , DISPATCH_QUEUE_SERIAL);
并行队列
dispatch_queue_t currentQuene = dispatch_queue_create( "my_concurrent_queue" , DISPATCH_QUEUE_CONCURRENT);
同步操作
dispatch_sync(serialQuene, ^{
要执行的代码
});
异步操作
dispatch_async(currentQuene, ^{
要执行的代码
});
注:同步操作不管加入到何种队列,只会在主线程按顺序执行;异步操作只在非主线程的线程执行,在串行队列中异步操作会在新建的线程中按顺序执行;异步操作,并行队列,理论上并行队列会给每一个异步操作新建线程,然后让所有的任务并发执行。但是实际上系统能创建的线程数量是有限的,当创建的线程达到最大线程数以后,后面的异步操作就需要等待前面的操作执行完毕才能得到执行。哪个线程操作执行完毕,就把等待的异步任务安排到哪个线程。直到所有的操作执行完毕。
三.NSOperation&NSOperationQueue
虽然GCD的功能已经很强大了,但是它使用的API依然是C语言的。在某些时候,在面向对象的objective-c中使用起来非常的不方便和不安全。
所以苹果公司把GCD中的操作抽象成NSOperation对象,把队列抽象成NSOperationQueue对象。
1.向主队列中添加操作
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
self.resultMessage.stringValue=[NSString stringWithFormat:@"当前线程信息:%@,第%d次循环\n",[NSThread currentThread],i+1];
}];//向主队列中添加操作都会放到主线程中执行
2.向非主队列中添加操作
NSOperationQueue *notMainQueue=[[NSOperationQueue alloc] init];
[notMainQueue addOperationWithBlock:^{
self.resultMessage.stringValue=[NSString stringWithFormat:@"当前线程信息:%@,第%d次循环\n",[NSThread currentThread],i+1];
}];//以块的方式添加操作
NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
[self operationAction:@
"这是NSBlockOperation"
];
}];
[notMainQueue addOperation:op];//添加NSBlockOperation对象
3.添加操作的方式
- (void)addOperation:(NSOperation *)op;
- (void)addOperationWithBlock:(void (^)(void))block