多线程复习

自旋锁 & 互斥锁

自旋锁:
atomic、OSSpinLock、dispatch_semaphore_t
临界区加锁,不解锁一直忙碌不停循环,没有线程切换的时间开销,用于执行频繁访问临界区任务。Runtime引用计数大量使用自旋锁。

互斥锁:
pthread_mutex、 @synchronized、NSLock、NSCondition、NSConditionLock、NSRecursiveLock

临界区加锁,被阻塞线程进入休眠,直到互斥锁释放后才被唤醒,线程开销大,用于不经常切换切耗时的操作。

线程通信

performSelector
NSMachPort
GCD

GCD & NSOperation

GCD

  • 基于C语言的面向内核多线程的技术,用于代替NSthread,发挥CPU多核优势提高CPU效率。
  • 最基本的是dispatchQueue,FIFO队列,
  • 并行Concurrent Queues、串行Serial Queues,同步线程sync、异步线程async
  • 使用简洁,不用考虑底层实现,
  • 很难控制并发异步线程之间的执行顺序和依赖关系
  • 无法终止已经执行的线程

NSOperation

  • 面向对象的多线程技术,是基于GCD的封装,GCD的高级抽象,
  • 配合NSOperationQueue配合使用,
  • 不支持FIFO对列
  • 可以设置线程间优先级和依赖关系,
  • 设置最大并发数,
  • 可以取消未执行线程,但不能终止正在执行线程
    -可以通过KVO观察NSOperation的状态

NSOperation

使用NSOperation子类的方式有三种:

NSInvocationOperation

NSBlockOperation

自定义子类继承NSOperation,实现内部相应的方法
NSOperation其实就是对GCD的一个封装。

创建NSInvocationOperation对象

-(id)initWithTarget:(id) target selector:(SEL)sel object:(id) arg;

调用start方法开始执行操作

-(void)start;

一旦执行操作,就会调用target的sel方法。

注意:默认情况下,调用了start方法后并不会开一条新线程去执行操作,而是在当前线程同步执行操作。

只有将NSOperation放到一个NSOperationQueue中,才会异步执行操作

创建NSBlockOperation对象

+(id)blockOperationWithBlock:(void (^)(void)) block;

通过addExecutionBlock:方法添加更多的操作

-(void)addExecutionBlock:(void (^)(void)) block;

注意:只要NSBlockOperation封装的操作数>1, 就会异步执行操作。

1 - (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
 2 {
 3 //    [self opDemo1];
 4 //    [self opDemo2];
 5 //    [self opDemo3];
 6     [self opDemo4];
 7 }
 8 
 9 - (void)down
10 {
11     for (int i = 0; i < 2; i ++) {
12           NSLog(@"%d", i+2);
13     }
14 }
15 
16 #pragma mark - 单个NSInvocationOperation使用
17 - (void) opDemo1
18 {
19     NSLog(@"1");
20     //创建操作
21     NSOperation * op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(down) object:@"Invocation"];
22     //直接在当前线程执行(同步执行)【没有开辟线程】
23     [op start];
24     //放到队列gg
25 //    NSOperationQueue * que = [[NSOperationQueue alloc] init];
26 //    //只要把操作添加到队列,就会异步执行任务(但是任务中的任务会顺序执行)【开辟了线程】
27 //    [que addOperation:op];
28     NSLog(@"3");
29 }
30 
31 - (void) opDemo2
32 {
33     NSLog(@"1");
34     /**
35      1.队列(GCD里面的并发(全局)队列使用最多),所以NSOperation技术直接把GCD里面的并发技术封装起来
36      2.NSOperationQueue,本质就是GCD里面的并发队列
37      3.操作是GCD里面的异步执行的任务
38      **/
39     NSOperationQueue * q = [[NSOperationQueue alloc] init];
40     for (int i = 0; i < 2; i ++) {
41         NSOperation * op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(down) object:@"Invocation"];
42         [q addOperation:op];
43     }
44     NSLog(@"4");
45 }
46 
47 - (void) opDemo3
48 {
49     NSLog(@"1");
50     //相当于GCD主队列
51     NSOperationQueue * q = [NSOperationQueue mainQueue];
52     //当NSOpertaion获取主线程,不会在开辟线程,但是里面的任务会在其他主线程任务执行完成后才回归执行
53     for (int i = 0; i < 5; i ++) {
54         
55         NSBlockOperation * op = [NSBlockOperation blockOperationWithBlock:^{
56            NSLog(@"%@==========%d", [NSThread currentThread], i);
57         }];
58         //将block放入到队列
59         //block中可以添加多个任务
60         [q addOperation:op];
61     }
62     NSLog(@"6");
63     
64 }
65 66 - (void) opDemo4
67 {
68     NSLog(@"1");
69     NSOperationQueue * q = [[NSOperationQueue alloc] init];
70     //block块中可以写多个任务(里面串行队列),相当于GCD中的并行串行队列
71     NSBlockOperation * op = [NSBlockOperation blockOperationWithBlock:^{
72         NSLog(@"2");
73         NSLog(@"3");
74         NSLog(@"4");
75     }];
76     [q addOperation:op];
77     //还可以在外面给队列添加任务.但是遵循fifo
78     [op addExecutionBlock:^{
79         NSLog(@"6");
80         NSLog(@"7");
81     }];
82     NSLog(@"5");
83 }
image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,258评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,335评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,225评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,126评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,140评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,098评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,018评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,857评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,298评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,518评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,400评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,993评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,638评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,661评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352