多线程 -- C语言
//依靠C语言,来执行, 效率最高
一.串行队列
//1.创建窜行队列
//(1)获取创建好的串行队列, 在主线程中实现线程同步
dispatch_queue_t quene1 = dispatch_get_main_queue();
//(2)自己创建串行队列, 任务在子线程中实现
dispatch_queue_t quene2 = dispatch_queue_create("com.lanou3g.oa", DISPATCH_QUEUE_SERIAL); //字符串 -- 唯一标识的作用(反域名形式) DISPATCH_QUEUE_SERIAL -- 指定为串行队列
//2.网队列中添加任务
dispatch_async(quene2, ^{
NSLog(@"任务1:%@", [NSThread currentThread]);
});
...
//释放
dispatch_release(quene2);
二.并行队列
//1.创建并行队列
//(1)获取创建好的并行队列
dispatch_queue_t quene1 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);//两个参数分别是优先级 , 预留参数
//(2)自己创建并发
dispatch_queue_t quene2 = dispatch_queue_create("com.lanou3g.oa", DISPATCH_QUEUE_CONCURRENT); // 参数1 -- 唯一标示
// 参数2 -- 指定为并发队列
//2往队列中添加任务
dispatch_async(quene2, ^{
NSLog(@"任务 1 :%@", [NSThread currentThread]);
});
...
//请求图片
//跳转到主线程刷新界面
dispatch_async(dispatch_get_main_queue(), ^{
//更新 UI 显示图片
});
//释放
dispatch_release(quene2);
三.分组任务
//1 创建并行队列
dispatch_queue_t quene = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//2 创建分组
dispatch_group_t group = dispatch_group_create();
//3 往分组中刚添加任务
dispatch_group_async(group, quene, ^{
NSLog(@"任务一 请求 0 - 20M 数据");
});
...
//4 当分组内的所有任务完成之后, 拼接操作
dispatch_group_notify(group, quene, ^{
NSLog(@"拼接数据!");
});
//释放
dispatch_release(group);
四.单例变量
static Singleton *single = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
single = [[Singleton alloc]init];
});
五.障碍
//障碍任务的作用: 可以保证障碍之后的并发的任务, 必须在障碍之前并发的任务执行结束之后, 才可以开始执行
//注意: 要添加障碍任务, 必须要使用自己创建的并发任务
//创建并发任务
dispatch_queue_t queue = dispatch_queue_create("com.lanoug.oa", DISPATCH_QUEUE_CONCURRENT);
//往队列中添加任务
dispatch_async(queue, ^{
NSLog(@"A写入文件");
});
...
//添加(设置)障碍任务
dispatch_barrier_async(queue, ^{
NSLog(@"此处是路障任务");
});
dispatch_async(queue, ^{
NSLog(@"E读取文件");
});
//释放
dispatch_release(queue);
六.延迟
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"5秒真男人");
});
//dispatch_get_main_queue 在主线程中执行(默认), 如果想在子线程中执行, 此处该为子线程即可;
七.反复执行
dispatch_apply(10, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(size_t index) {
NSLog(@"哈哈 - %ld", index);
}); // size_t 之后要添加参数名 比如: index
***********************
dispatch_apply(10, dispatch_get_main_queue(), ^(size_t index) {
NSLog(@"哈哈 - %ld", index);
});