多线程
*DISPATCH_QUEUE_SERIAL线程属性为串行
*
*串行队列的异步任务,我们使用的最多
*
*串行:
同步:不会开辟多线程,一个接一个执行事件
异步:一定一定会开辟线程 但是放在串行队列当中的,所以时间执行顺序一件接着一件
可以保证效率,又可以实现任务并发
*并行:
同步:不会开辟多线程,一件接着一件
异步:一定会开辟线程,但是放在并行队列中所有执行顺序是不可控(不建议)
*主队列
主队列中的同步任务造成线程阻塞,任务无法执行;
-(void)gcdDemo1{
//创建多线程
dispatch_queue_t q=dispatch_queue_create("com.lamco.one",DISPATCH_QUEUE_SERIAL);
//开启一个 同步 事件
for(int i=0;i<10;i++){
dispatch_sync(q, ^{
//currentThread 可以跟踪当前线程
NSLog(@"%@ %d",[NSThread currentThread],i);
});
}
//开启一个异步事件
for(int j=0;j<10;j++){
dispatch_async(q, ^{
//currentThread 可以跟踪当前线程
NSLog(@"%@ %d",[NSThread currentThread],j);
});
}
//dispatch_async(<#dispatch_queue_t queue#>, <#^(void)block#>)
}
#pragma mark -并行队列
-(void)gcdDemo2{
dispatch_queue_t q=dispatch_queue_create("hhhhh", DISPATCH_QUEUE_CONCURRENT);
for(int i=0;i<10;i++){
dispatch_sync(q, ^{
//currentThread 可以跟踪当前线程
NSLog(@"%@ %d",[NSThread currentThread],i);
});
}
//开启一个异步事件
for(int j=0;j<10;j++){
dispatch_async(q, ^{
//currentThread 可以跟踪当前线程
NSLog(@"%@ %d",[NSThread currentThread],j);
});
}
}
#pragma mark-全局队列(Apple为了方便多线程设计,提供的全局队列)
-(void)gcdDemo3{
/**
*全局队列,不需要我们自己creat,直接get就可以使用
*@param 第一个参数:线程的优先级,一般用DEFAULT 其他分别:hight ,low,background
*@param -void 第二个参数传入0就行,apple预留的
*
*/
dispatch_queue_t q=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//开启一个 同步 事件
for(int i=0;i<10;i++){
//同步事件,顺序执行
dispatch_sync(q, ^{
NSLog(@"%@ %d",[NSThread currentThread],i);
});
}
//开启一个异步事件
// for(int j=0;j<10;j++){
// dispatch_async(q, ^{
// //currentThread 可以跟踪当前线程
//开启一个 异步事件,并发执行,和自己创建的并行队列没有差别,调试的时候没有办法确认
// NSLog(@"%@ %d",[NSThread currentThread],j);
// });
// }
}
#pragma mark-主队列,保证操作在主线程上执行
-(void)gcdDemo4{
/**
*每一个应用程序都有一个主线程(因为ios 规定所用ui相关操作都必须在主线程上进行)
*/
dispatch_queue_t q=dispatch_get_main_queue();
// 同步事件 线程阻塞(因为主线程是有工作的,除非住线程杀死,否则工作永远不会结束)
// dispatch_sync(q, ^{
// NSLog(@"hello");
// });
//异步事件在主队列中执行时候是保持队形的
dispatch_async(q, ^{
NSLog(@"hello");
});
[thread1 start];
第二种线程创建方式
[NSThread detachNewThreadSelector:@selector(doThread2:) toTarget:self withObject:@"lhp"];
第三种线程线程创建方式
//第四种线程创建方式
//创建了一个线程队列
// NSOperationQueue *q = [[NSOperationQueue alloc] init];
// q.maxConcurrentOperationCount = 3;//设置最大线程并发数
// //创建线程
// NSInvocationOperation *opreation1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(doOperation1) object:nil];//
// NSInvocationOperation *opreation2 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(doThread1:) object:nil];//
// NSInvocationOperation *opreation3 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(doThread2:) object:nil];//
//
// [opreation2 setQueuePriority:NSOperationQueuePriorityVeryHigh];//设置线程的优先级
// [opreation3 setQueuePriority:NSOperationQueuePriorityVeryLow];
//
// [q addOperation:opreation1];
// [q addOperation:opreation2];
// [q addOperation:opreation3];
//第五种线程的创建方式
// dispatch_sync(<#dispatch_queue_t queue#>, <#^(void)block#>)同步事件
// dispatch_async(<#dispatch_queue_t queue#>, <#^(void)block#>)异步事件
// dispatch_queue_create(<#const char *label#>, <#dispatch_queue_attr_t attr#>)创建线程队列
// dispatch_release(<#dispatch_object_t object#>)//非ARC的线程队列的内存管理
// dispatch_get_main_queue()获取主队列
// dispatch_get_global_queue(<#long identifier#>, <#unsigned long flags#>)获取全局队列
// dispatch_async(dispatch_get_global_queue(0, 0), ^{
// NSLog(@"something %@",[NSThread currentThread]);
// });
// static dispatch_once_t one;
// dispatch_once(&one, ^{
// NSLog(@"onece %@",[NSThread currentThread]);
// });
//延迟执行
// double time = 2.0;
// //NSEC_PER_SEC表示系统的“秒”
// dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, time * NSEC_PER_SEC);
// dispatch_after(popTime, dispatch_get_main_queue(), ^{
// //
// });
//
// dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
// //
// });
//线程队列事件的汇总
// dispatch_group_t group = dispatch_group_create();
// dispatch_group_async(group, <#dispatch_queue_t queue#>, <#^(void)block#>)
// dispatch_group_notify(group, <#dispatch_queue_t queue#>, <#^(void)block#>)
self.queue = [[NSOperationQueue alloc]init];
NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"*1**download image %@",[NSThread currentThread]);
}];
NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"*2***updata image %@",[NSThread currentThread]);
}];
NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"*3****save image %@",[NSThread currentThread]);
}];
NSBlockOperation *op4 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"*4*****show image %@",[NSThread currentThread]);
}];
//设定执行顺序,dependency依赖,可以跨队列
[op2 addDependency:op1];
[op3 addDependency:op2];
[op4 addDependency:op3];
[self.queue addOperation:op1];
[self.queue addOperation:op2];
[self.queue addOperation:op3];
[[NSOperationQueue mainQueue] addOperation:op4];
[self.queue addOperationWithBlock:^{
//
}];
// __block int a;
// int (^myBlock)(int,int)=^(int a,int b){ return a+b; };
}
-(void)doOperation1
{
NSLog(@"doOperation1:%@",[NSThread currentThread]);
[NSThread isMainThread];//判断是不是主线程
[NSThread isMultiThreaded];//判断是不是子线程
}
-(void)doThread1:(id)sender
{
NSLog(@"doThread1:%@",[NSThread currentThread]);
}
-(void)doThread2:(id)sender
{
NSLog(@"doThread2:%@ %@",[NSThread currentThread],sender);
}