方法一:NSThread
一:[[NSThread alloc]init];直接创建
二:[[NSThread alloc] initWithTarget:调用谁的 selector:方法 object:参数]。需要手动调用start方法
三:[NSThread detachNewThreadSelector:方法 toTarget:调用谁的 withObject:参数];从主线程中分离一条线程出来。不需要手动调用start方法。
四:[self performSelectorInBackground:方法 withObject:参数];在后台(子线程)调用这个方法。没有start方法。
需要手动调用start方法的原因是:
默认创建一个线程是`新建状态New`,当调用start方法是会将线程放到`可调度线程池`中,此时为`就绪状态Runnable`,只有在可调用线程池中的线程才会被调用。
当cpu调用时线程,此时线程为`运行状态Running`。当调用线程的sleep时,进入`阻塞状态Blocked`。当线程执行完毕或者意外死亡,此时线程为`死亡状态Dead`。
方法二:NSOperation之NSInvocationOperation
//将NSInvocationOperation操作添加到队列中
NSInvocationOperation *invocationOperation = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(方法) object:nil];
NSOperationQueue *operationQueue = [[NSOperationQueue alloc]init];
[operationQueue addOperation:invocationOperation];
方法三:NSOperation之NSBlockOperation
NSBlockOperation有两种方式
第一种:将操作放到队列中
NSOperationQueue *operationQueue = [[NSOperationQueue alloc]init];
NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"%@",[NSThread currentThread]);
}];
[operationQueue addOperation:blockOperation];
第二种:只要NSBlockOperation封装的操作数大于1就会创建线程,不需要我们手动将操作放入到队列中
NSBlockOperation *blockOperation = [NSBlockOperation
//这个操作在主线程中执行
blockOperationWithBlock:^{
NSLog(@"%@",[NSThread currentThread]);
}];
//这个线程在子线程中执行
[blockOperation addExecutionBlock:^{
NSLog(@"%@",[NSThread currentThread]);
}];
[blockOperation start];
注意:NSOperation的NSInvocationOperation和NSBlockOperation如果不加入队列都需要手动开启start。已经加入到队列中的操作如果再次手动start就会报错。
错误信息如下:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSOperationInternal _start:]: something other than the operation queue it is in is trying to start the receiver'
方法四:自定义NSOperation重写main方法
自定义一个类,继承自NSOperation,重写main方法。
创建这个对象,将这个对象加入到队列中NSOperationQueue,就能在子线程中执行。
方法五:GCD只有异步才具备开启线程的能力
第一种:异步+手动创建串行队列:都在一个线程中执行
//串行队列
dispatch_queue_t queue = dispatch_queue_create(nil, DISPATCH_QUEUE_SERIAL);
dispatch_async(queue1, ^{
for (int a = 0; a < 100;a++) {
NSLog(@"1111111=========%@",[NSThread currentThread]);
}
}) ;
dispatch_async(queue1, ^{
for (int a = 0; a < 100;a++) {
NSLog(@"222222=========%@",[NSThread currentThread]);
}
}) ;
dispatch_async(queue1, ^{
for (int a = 0; a < 100;a++) {
NSLog(@"333333=========%@",[NSThread currentThread]);
}
}) ;
第二种:异步+手动创建并发队列:在不同线程中执行
dispatch_queue_t queue1 = dispatch_queue_create(nil, DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue1, ^{
for (int a = 0; a < 100;a++) {
NSLog(@"1111111=========%@",[NSThread currentThread]);
}
}) ;
dispatch_async(queue1, ^{
for (int a = 0; a < 100;a++) {
NSLog(@"2222222=========%@",[NSThread currentThread]);
}
}) ;
dispatch_async(queue1, ^{
for (int a = 0; a < 100;a++) {
NSLog(@"3333333=========%@",[NSThread currentThread]);
}
}) ;
网友评论