标签:
1.NSThread的使用
方式一:开启多线程,并且执行方法threadAction
[self performSelectorInBackGround:@selector(threadAction) withObject:nil];
方式二:
NSThread *thread =[[NSThread alloc]initWithTarget:self selector:@selector(threadAction:) object:@"text"] thread.name = @"thread1"; //开启线程 [thread start];
方式三:开启新的线程,并且执行
[NSThread decathNewThreadSelector:@selector(threadAction) toTarget:self withObject:@"哈哈"]; - (void)threadAction:(NSString *)str { //1.获取当前线程对象 NSThread *thread = [NSThread currentThread]; NSLog(@"thread:%@",thread); //2.判断当前是否是在多线程 if ([NSThread isMultiThreaded]) { NSLog(@"当前是否是多线程"); } for (int i=0; i<50; i++) { NSLog(@"thread:%d",i); if (i == 10) { //让当前线程睡眠3秒 // [NSThread sleepForTimeInterval:3]; //退出当前线程 // [NSThread exit]; } } //回到主线程 // [self performSelectorOnMainThread:<#(SEL)#> withObject:<#(id)#> waitUntilDone:<#(BOOL)#>] }
2.NSOperationQueue的使用
//创建线程队列 NSOperationQueue *queue = [[NSOperationQueue alloc] init]; //关闭暂停队列 [queue setSuspend: YES]; //设置最大并发数 queue.maxConcurrentOperationCount = 1; //创建线程 NSInvocationOperation *operation1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(thread1:) object:@"op1"]; NSInvocationOperation *operation2 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(thread1:) object:@"op2"]; //设置线程的优先级 operation1.queuePriority = NSOperationQueuePriorityNormal; operation1.queuePriority = NSOperationQueuePriorityHigh; //将线程添加到队列中 [queue addOperation:operation1]; [queue addOperation:operation2]; //直接用block [queue addOperationWithBlock:^{ @autoreleasepool { for (int i = 0; i < 50; i ++) { NSLog(@"op3:%d",i); } } }]; //开始队列 [queue setSuspended:NO]; - (void)thread1:(NSString *)threadName { @autoreleasepool { for (int i=0; i<50; i++) { NSLog(@"thread1:%d",i); } } } - (void)thread2:(NSString *)threadName { @autoreleasepool { for (int i=0; i<50; i++) { NSLog(@"thread2:%d",i); } [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timeAction) userInfo:nil repeats:YES]; //如果设置定时器,必须设置runLoop,线程二则不会关闭; // [[NSRunLoop currentRunLoop] run]; } } - (void)timeAction { NSLog(@"timeAction"); }
3.GCD的使用
一:队列
串行队列:添加到队列中的任务是一个一个执行的
并行(发)队列:添加到队列中的任务是多个同时执行的
主队列:里面的任务都是在主线程执行的,可以理解为主队列就是串行队列的一种
全局队列:并行(发)队列
二:同步、异步
同步:需要后面的任务等待,不会开启新的线程,会直接使用当前的线程
异步:不需要后面的任务等待,会开启新的线程
1.创建并发队列
优先级:
DISPATCH_QUEUE_PRIORITY_HIGH
DISPATCH_QUEUE_PRIORITY_DEFAULT
DISPATCH_QUEUE_PRIORITY_LOW
DISPATCH_QUEUE_PRIORITY_BACKGROUND
//1.创建并行队列 // dispatch_queue_t queue1 = dispatch_queue_create("queue1", DISPATCH_QUEUE_CONCURRENT); //2.获取全局队列(并行队列) dispatch_queue_t queue2 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
1.1向并发队列中添加任务
<1>异步添加任务
dispatch_async(queue2, ^{ @autoreleasepool { for (int i=0; i<50; i++) { NSLog(@"1....i:%d",i); } } }); for (int i=0; i<50; i++) { NSLog(@"??....i:%d",i); } dispatch_async(queue2, ^{ for (int i=0; i<50; i++) { NSLog(@"2....i:%d",i); } });
<2>同步添加任务
dispatch_sync(queue2, ^{ for (int i=0; i<50; i++) { NSLog(@"??....i:%d",i); } }); for (int i=0; i<50; i++) { NSLog(@"??....i:%d",i); } dispatch_sync(queue2, ^{ for (int i=0; i<50; i++) { NSLog(@"??....i:%d",i); } });
2.创建串行队列
dispatch_queue_t queue = dispatch_queue_create("queue3", DISPATCH_QUEUE_SERIAL);
1.1向串行队列中添加任务
<1>异步添加
dispatch_async(queue, ^{ for (int i=0; i<50; i++) { NSLog(@"??....i:%d",i); } }); dispatch_async(queue, ^{ for (int i=0; i<50; i++) { NSLog(@"??....i:%d",i); } }); for (int i=0; i<100; i++) { NSLog(@"??...--------.i:%d",i); }
<2>同步添加任务
dispatch_sync(queue, ^{ for (int i=0; i<50; i++) { NSLog(@"??....i:%d",i); } }); dispatch_sync(queue, ^{ for (int i=0; i<50; i++) { NSLog(@"??....i:%d",i); } }); for (int i=0; i<100; i++) { NSLog(@"??...--------.i:%d",i); }
3.创建主队列(在使用主队列的时候,绝对不可以在主队列中同步添加任务)
dispatch_queue_t mainQueue = dispatch_get_main_queue(); //向刚才创建的并发队列中异步添加一个网络加载的任务,加载完成后,回到主线程操作UI dispatch_async(queue2, ^{ NSLog(@"网络加载"); //完成了 dispatch_async(mainQueue, ^{ NSLog(@"操作UI"); }); });
标签:
原文地址:http://my.oschina.net/zhangqy/blog/509582