您的位置:首页 > 移动开发 > IOS开发

IOS对于多线程NSOperation方式的一些发现.

2016-07-11 14:24 375 查看
验证在设定最大线程队列组为1的情况下,队列组内是否可以追加任务?

验证在设定最大线程队列组为1的情况下,队列组内的任务线程数量多少的概念?

验证添加到队列自代码的位置,于并发执行任务代码的位置关系,是否会影响并发任务的先后顺序?

验证不同方式添加并发任务是否会存在潜在优先级的概念?

代码例子:

- (void)method {
NSLog(@"%s",__func__);
NSOperationQueue *queue = [[NSOperationQueue alloc] init];

NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"1--%@",[NSThread currentThread]);
}];
NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"2--%@",[NSThread currentThread]);
}];
NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"3--%@",[NSThread currentThread]);
}];

queue.maxConcurrentOperationCount = 1;

[queue addOperation:op1];
[queue addOperation:op2];
[queue addOperation:op3];

[op1 addExecutionBlock:^{
NSLog(@"5--%@",[NSThread currentThread]);
}];

[op3 addExecutionBlock:^{
NSLog(@"6--%@",[NSThread currentThread]);
}];

[queue addOperationWithBlock:^{
NSLog(@"4--queue%@",[NSThread currentThread]);
}];

}


实验结果:

2016-07-11 13:45:47.515 06-[11380:9735981] -[ViewController method]

2016-07-11 13:45:47.516 06-[11380:9738435] 1--<NSThread: 0x7fc1aa40d250>{number = 14, name = (null)}

2016-07-11 13:45:47.516 06-[11380:9738430] 5--<NSThread: 0x7fc1ac90b4a0>{number = 13, name = (null)}

2016-07-11 13:45:47.516 06-[11380:9738430] 2--<NSThread: 0x7fc1ac90b4a0>{number = 13, name = (null)}

2016-07-11 13:45:47.516 06-[11380:9738430] 6--<NSThread: 0x7fc1ac90b4a0>{number = 13, name = (null)}

2016-07-11 13:45:47.516 06-[11380:9738435] 3--<NSThread: 0x7fc1aa40d250>{number = 14, name = (null)}

2016-07-11 13:45:47.517 06-[11380:9738430] 4--queue<NSThread: 0x7fc1ac90b4a0>{number = 13, name = (null)}

结果证明:即使队列组设置了最大线程数为1的情况下,队列组依然可以添加额外任务,并且线程数明显可以看到具有14和13两条线程.

实验队列组并发的潜在顺序:

2016-07-11 13:51:48.988 06-掌握-操作队列的基本使用[11380:9735981]
-[ViewController method]


2016-07-11 13:51:48.989 06-掌握-操作队列的基本使用[11380:9743279]
1--<NSThread: 0x7fc1aa52ba90>{number = 15, name = (null)}


2016-07-11 13:51:48.989 06-掌握-操作队列的基本使用[11380:9743281]
5--<NSThread: 0x7fc1aa62d050>{number = 16, name = (null)}


2016-07-11 13:51:48.989 06-掌握-操作队列的基本使用[11380:9743281]
2--<NSThread: 0x7fc1aa62d050>{number = 16, name = (null)}


2016-07-11 13:51:48.989 06-掌握-操作队列的基本使用[11380:9743279]
3--<NSThread: 0x7fc1aa52ba90>{number = 15, name = (null)}


2016-07-11 13:51:48.989 06-掌握-操作队列的基本使用[11380:9743281]
6--<NSThread: 0x7fc1aa62d050>{number = 16, name = (null)}


2016-07-11 13:51:48.990 06-掌握[b]-操作队列的基本使用[11380:9743281]
4--queue<NSThread: 0x7fc1aa62d050>{number = 16, name = (null)}


经过多次验证,数据显示,按照以上代码顺序.先添加到队列组的任务即使在并发队列中优先级别也会高一点.序列1,2,3是先添加到队列组的,其中序列5,6分别以追加任务的方式添加到op1和op3中,序列4是通过队列组来添加到队列中的,多次验证的顺序如下:

2016-07-11 13:59:01.151 06-[11380:9735981] -[ViewController method]

2016-07-11 13:59:01.151 06-[11380:9749519] 5--<NSThread: 0x7fc1acb031a0>{number = 20, name = (null)}

2016-07-11 13:59:01.151 06-[11380:9749437] 1--<NSThread: 0x7fc1aa627da0>{number = 19, name = (null)}

2016-07-11 13:59:01.152 06-[11380:9749521] 2--<NSThread: 0x7fc1ac805760>{number = 21, name = (null)}

2016-07-11 13:59:01.152 06-[11380:9749437] 3--<NSThread: 0x7fc1aa627da0>{number = 19, name = (null)}

2016-07-11 13:59:01.152 06-[11380:9749521] 6--<NSThread: 0x7fc1ac805760>{number = 21, name = (null)}

2016-07-11 13:59:01.152 06-[11380:9749521] 4--queue<NSThread: 0x7fc1ac805760>{number = 21, name = (null)}

2016-07-11 14:00:49.170 06-[11380:9751641] 1--<NSThread: 0x7fc1ac802f20>{number = 26, name = (null)}

2016-07-11 14:00:49.170 06-[11380:9751757] 5--<NSThread: 0x7fc1aa417c70>{number = 28, name = (null)}

2016-07-11 14:00:49.170 06-[11380:9751757] 2--<NSThread: 0x7fc1aa417c70>{number = 28, name = (null)}

2016-07-11 14:00:49.171 06-[11380:9751757] 6--<NSThread: 0x7fc1aa417c70>{number = 28, name = (null)}

2016-07-11 14:00:49.171 06-[11380:9751641] 3--<NSThread: 0x7fc1ac802f20>{number = 26, name = (null)}

2016-07-11 14:00:49.171 06-[11380:9751757] 4--queue<NSThread: 0x7fc1aa417c70>{number = 28, name = (null)}

2016-07-11 14:01:46.693 06-[11380:9735981] -[ViewController method]

2016-07-11 14:01:46.694 06-[11380:9752865] 5--<NSThread: 0x7fc1aa52db20>{number = 32, name = (null)}

2016-07-11 14:01:46.694 06-[11380:9752861] 1--<NSThread: 0x7fc1acb04270>{number = 31, name = (null)}

2016-07-11 14:01:46.694 06-[11380:9752865] 2--<NSThread: 0x7fc1aa52db20>{number = 32, name = (null)}

2016-07-11 14:01:46.694 06-[11380:9752861] 3--<NSThread: 0x7fc1acb04270>{number = 31, name = (null)}

2016-07-11 14:01:46.694 06-[11380:9752865] 6--<NSThread: 0x7fc1aa52db20>{number = 32, name = (null)}

2016-07-11 14:01:46.694 06-[11380:9752865] 4--queue<NSThread: 0x7fc1aa52db20>{number = 32, name = (null)}

实验证明:队列组设置最大线程为1,队列组内序列为1,2,3的任务是按照串发关系执行的.追加的任务则是并发随机显示在执行结果中.调用时的顺序则是按照添加op对象的顺序来执行追加的.潜在优先级高于最后使用queue 方法追加到队列组的任务优先级.我们看到queue始终在最后边.当然很少情况下,queue 也会在非最后一个的位置,当然这个情况非常少!

使用新的顺序:

- (void)method {
NSLog(@"%s",__func__);
NSOperationQueue *queue = [[NSOperationQueue alloc] init];

NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"1--%@",[NSThread currentThread]);
}];
NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"2--%@",[NSThread currentThread]);
}];
NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"3--%@",[NSThread currentThread]);
}];

queue.maxConcurrentOperationCount = 1;

[op1 addExecutionBlock:^{
NSLog(@"5--%@",[NSThread currentThread]);
}];

[op3 addExecutionBlock:^{
NSLog(@"6--%@",[NSThread currentThread]);
}];

[queue addOperationWithBlock:^{
NSLog(@"4--queue%@",[NSThread currentThread]);
}];

[queue addOperation:op1];
[queue addOperation:op2];
[queue addOperation:op3];

}


把添加到队列组的方法放在最后,执行多次后发现:

2016-07-11 14:10:20.656 06-[11734:9759706] -[ViewController method]

2016-07-11 14:10:20.657 06-[11734:9759772] 4--queue<NSThread: 0x7fc39aa00100>{number = 3, name = (null)}

2016-07-11 14:10:20.658 06-[11734:9759765] 1--<NSThread: 0x7fc399752000>{number = 2, name = (null)}

2016-07-11 14:10:20.658 06-[11734:9759772] 5--<NSThread: 0x7fc39aa00100>{number = 3, name = (null)}

2016-07-11 14:10:20.658 06-[11734:9759772] 2--<NSThread: 0x7fc39aa00100>{number = 3, name = (null)}

2016-07-11 14:10:20.658 06-[11734:9759765] 3--<NSThread: 0x7fc399752000>{number = 2, name = (null)}

2016-07-11 14:10:20.658 06-[11734:9759772] 6--<NSThread: 0x7fc39aa00100>{number = 3, name = (null)}

2016-07-11 14:12:40.987 06-[11734:9759706] -[ViewController method]

2016-07-11 14:12:40.987 06-[11734:9763018] 4--queue<NSThread: 0x7fc39a902c30>{number = 4, name = (null)}

2016-07-11 14:12:40.987 06-[11734:9763018] 5--<NSThread: 0x7fc39a902c30>{number = 4, name = (null)}

2016-07-11 14:12:40.987 06-[11734:9763012] 1--<NSThread: 0x7fc39a902090>{number = 5, name = (null)}

2016-07-11 14:12:40.988 06-[11734:9763018] 2--<NSThread: 0x7fc39a902c30>{number = 4, name = (null)}

2016-07-11 14:12:40.988 06-[11734:9763012] 3--<NSThread: 0x7fc39a902090>{number = 5, name = (null)}

2016-07-11 14:12:40.988 06-[11734:9763018] 6--<NSThread: 0x7fc39a902c30>{number = 4, name = (null)}

2016-07-11 14:13:21.239 06-[11734:9759706] -[ViewController method]

2016-07-11 14:13:21.240 06-[11734:9763934] 4--queue<NSThread: 0x7fc39a903650>{number = 6, name = (null)}

2016-07-11 14:13:21.240 06-[11734:9763934] 5--<NSThread: 0x7fc39a903650>{number = 6, name = (null)}

2016-07-11 14:13:21.240 06-[11734:9763927] 1--<NSThread: 0x7fc39975e050>{number = 7, name = (null)}

2016-07-11 14:13:21.240 06-[11734:9763934] 2--<NSThread: 0x7fc39a903650>{number = 6, name = (null)}

2016-07-11 14:13:21.241 06-[11734:9763927] 6--<NSThread: 0x7fc39975e050>{number = 7, name = (null)}

2016-07-11 14:13:21.241 06-[11734:9763934] 3--<NSThread: 0x7fc39a903650>{number = 6, name = (null)}

截取以上三组数据:
数据证明在把 使用队列组追加任务的方法时,发现潜在的并发优先级非常高.几乎都是在第一位.

由此推论:使用NSOperation并发方式实现任务时,任务代码的添加方式,追加方式的不同体现了并发执行中也存在潜在先后顺序的问题.并且我们发现在使用最后把线程对象添加到队列组中的方法时,优先级非常的高!!!借此我们可以良好的在并发执行中有选择性的采取不同的添加方式和不同的代码顺序.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  多线程 并发 ios开发