//ios 多线程的实现方法
//1.runtime 实现多线程
//后台运行 某种方法
// [self performSelectorInBackground:@selector(syncLoadImage) withObject:Nil];//运行时编程的一种方式
//2.NSThread 线程类实现多线程
/*
*优点:1.最轻量级(CPU占用少) 2.最容易控制
*缺点:1.太繁琐 2.可读性差
*/
// NSThread * thread = [[NSThread alloc]initWithTarget:self selector:@selector(syncLoadImage) object:Nil];
//
// thread.name = @"name"; // 不会体现出来
//
// //开始线程
//
// [thread start];
//3.NSOperation
//OC层面的线程管理类
//优点:1.不需要关心线程同步,线程控制
//2.引入一个线程池/线程队列的概念
//1.
// NSInvocationOperation * operation = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(syncLoadImage) object:Nil];
//
// [operation start];
//2.
// NSBlockOperation * blockOperation = [NSBlockOperation blockOperationWithBlock:^{
//
// NSLog(@"========");
// [NSThread sleepForTimeInterval:2];
// NSLog(@"111111");
//
// }];
//
// [blockOperation start];
//3.线程池/线程队列 管理内存的所有线程
// 当一个线程执行完毕,将该线程挂起
// 如果有一个新任务,利用挂起的线程直接执行
// NSOperationQueue * queue = [[NSOperationQueue alloc]init];
//添加一个线程
// 1. [queue addOperation:添加一个队列]
//2.
// [queue addOperationWithBlock:^{
// NSLog(@"*******");
// }];
//
// [queue addOperationWithBlock:^{
// NSLog(@"123456789");
// }];
//
// [queue addOperationWithBlock:^{
// NSLog(@"哈哈哈");
// }];
//GCD
//1.产生一个队列(串行(主队列) 并行)
//获取主队列
dispatch_queue_t mainQueue = dispatch_get_main_queue();
//在队列里运行方法
//第一个参数:在哪个队列里运行
//第二个参数:Block块里面写需要运行的方法
// dispatch_async(mainQueue, ^{
//
// for (int i = 0; i < 10000; i++) {
// NSLog(@"%d",i);
// }
//
// });
//
//
//
// dispatch_async(mainQueue, ^{
//
// for (int i = 0; i < 10000; i++) {
// NSLog(@"%d",i);
// }
//
// });
//2.获取全局队列(并行队列)
//第一个参数:选定全局队列的优先级:高/普通/低/后台
//第二个参数:苹果还没想好
dispatch_queue_t global = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT ,0);
//
// dispatch_async(global, ^{
//
// for (int i = 0; i < 10000; i++) {
// NSLog(@"%d",i);
// }
//
// });
//
//
//
// dispatch_async(global, ^{
//
// for (int i = 10000; i > 1; i--) {
// NSLog(@"%d",i);
// }
//
// });
//自定义 队列
//第一个参数:队列的名字
//第二个参数:队列的属性
// static dispatch_once_t onceToken;
// dispatch_once(&onceToken, ^{
// 要执行的线程
// });
dispatch_queue_t queue = dispatch_queue_create("liuxin", DISPATCH_QUEUE_CONCURRENT); //并行
dispatch_queue_t queueSerial = dispatch_queue_create("liuxin2", DISPATCH_QUEUE_SERIAL); //串行
//
// dispatch_async(global, ^{
//
// NSURL * url = [NSURL URLWithString:@"http://img6.ngacn.cc/attachments/mon_201402/01/-447601_52ebef52f03dc.jpg"];
//
// NSData * data = [NSData dataWithContentsOfURL:url];
// UIImage * image = [UIImage imageWithData:data];
//
// //在全局队列中转到主队列执行UI操作
// dispatch_async(mainQueue, ^{
//
// self.imageView.image = image;
//
// });
//
//
// NSLog(@"1111");
//
// });
//GCD高阶用法
//1.使代码只运行一次(单例时使用 保证线程安全)
// static dispatch_once_t onceToken;
// dispatch_once(&onceToken, ^{
// NSLog(@"");
// });
//
// //2.让代码等待一段时间在执行dispatch_af 回车 就出现如下代码块
//
// double delayInSeconds = 2.0;
// dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
// dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
// NSLog(@"5555555555");
// });
//3.让代码执行多次
//第一个参数:要执行的次数
//第二个参数:在哪个队列中执行
//第三个参数:
dispatch_apply(5, queue, ^(size_t a) {
NSLog(@"%zu",a);
});