多线程与GCD

//——————————————————————NSThread多线程的开启————————————————————————————————

// 1.第一种开启新的线程调用

mutableThread NSThread *thread=[[NSThread alloc] initWithTarget:self selector:@selector(mutableThread) object:nil];

[thread start]; //需要手动开启 


// 2.第二种开启新的线程调用 mutableThread

[NSThread detachNewThreadSelector:@selector(mutableThread) toTarget:self withObject:nil];


// 3.第三种开启新的线程调用 mutableThread [self performSelectorInBackground:@selector(mutableThread) withObject:nil];


//——————————————————————线程队列NSOperationQueue—————————————————————————— 


//1.block语法启动一个线程

NSOperationQueue *threadQueue1=[[NSOperationQueue alloc] init];

[threadQueue1 addOperationWithBlock:^{ NSThread *t=[NSThread currentThread]; if (![t isMainThread]) { NSLog(@"是主线程"); } }]; 


//2.NSOperationQueue 队列 NSOperation开启一个线程

NSOperationQueue *threadQueue2=[[NSOperationQueue alloc] init];

//操作任务

NSInvocationOperation *op=[[NSInvocationOperation alloc] initWithTarget:self selector:@selector(mutableThread) object:nil];

[threadQueue2 addOperation:op];

//在主线程上调用 reloadData 方法

[self performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];


//3.队列的执行顺序(FIFO 先进先出)

//创建队列

NSOperationQueue *queue=[[NSOperationQueue alloc] init];

// //暂停队列//[queue setSuspended:YES];

//queue队列执行操作的个数 默认-1(设置会限制queue队列能执行多少个操作) queue.maxConcurrentOperationCount=NSOperationQueueDefaultMaxConcurrentOperationCount;

//创建操作

NSBlockOperation *op1=[NSBlockOperation blockOperationWithBlock:^{ NSLog(@"task op1"); }];

NSBlockOperation *op2=[NSBlockOperation blockOperationWithBlock:^{ NSLog(@"task op2"); }];

NSBlockOperation *op3=[NSBlockOperation blockOperationWithBlock:^{ NSLog(@"task op3"); }]; /

/添加到队列中

[queue addOperation:op1];

[queue addOperation:op2];

[queue addOperation:op3];

//添加依赖 op2执行完之后才执行op1

[op1 addDependency:op2];

//优先级 /* NSOperationQueuePriorityVeryLow = -8L, NSOperationQueuePriorityLow = -4L, NSOperationQueuePriorityNormal = 0, NSOperationQueuePriorityHigh = 4, NSOperationQueuePriorityVeryHigh = 8 */

//设置执行优先级

op3.queuePriority=NSOperationQueuePriorityVeryHigh;

//(1)添加到队列的顺序

//(2)操作执行的优先级

//(3)操作的依赖关系

//—————————————————————GCD(Grand Central DisPatch)————————————————————————

/* 队列执行优先级 #define DISPATCH_QUEUE_PRIORITY_HIGH 2 #define DISPATCH_QUEUE_PRIORITY_DEFAULT 0 ———>全局队列 #define DISPATCH_QUEUE_PRIORITY_LOW (-2) #define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN */

//全局队列(可能会开启多条线程)

dispatch_queue_t global=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

//串行队列(只可能会开启一条线程)

//#define DISPATCH_QUEUE_SERIAL NULL

dispatch_queue_t queue2=dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT);

//主队列

dispatch_queue_t main=dispatch_get_main_queue();


//GCD使用

//1.创建Serial Dispatch Queue(串行队列)

dispatch_queue_t q1=dispatch_queue_create("com.wxhl.serial1", NULL);

dispatch_queue_t q2=dispatch_queue_create("com.wxhl.serial2", DISPATCH_QUEUE_SERIAL);

//往队列q1添加操作 dispatch_async(q1, ^{ ; });

//往队列q2添加操作 dispatch_async(q2, ^{ ; });


//2.创建Concurrent Dispatch Queue(并行队列)

dispatch_queue_t q3=dispatch_queue_create("com.wxhl.concurrent", DISPATCH_QUEUE_CONCURRENT); /

/往队列q3添加操作 dispatch_async(q3, ^{ ; });

// dispatch_release;

// dispatch_retain;

#warning mark- ios6之后,GCD兼容了ARC 不需要手动管理GCD内存了 


//——————————————————同步/异步操作,死锁问题—————————————————————————————————— 


/* 所谓死锁: 是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。 */

/*操作步骤: 1.拿到主队列 2.分配同步/异步操作 */

dispatch_queue_t mainT=dispatch_get_main_queue();

//异步操作:

dispatch_async dispatch_async(mainT, ^{ //做什么操作 dispatch_sync(mainT, ^{ //做什么操作 NSLog(@"sync间接引发了死锁"); }); });

//同步操作:

dispatch_sync ---->容易引起死锁 使用要注意 dispatch_sync(mainT, ^{ //做什么操作 NSLog(@"sync直接引发了死锁"); });

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。