IOS对于多线程NSOperation方式的一些发现.
2016-07-11 14:24
375 查看
验证在设定最大线程队列组为1的情况下,队列组内是否可以追加任务?
验证在设定最大线程队列组为1的情况下,队列组内的任务线程数量多少的概念?
验证添加到队列自代码的位置,于并发执行任务代码的位置关系,是否会影响并发任务的先后顺序?
验证不同方式添加并发任务是否会存在潜在优先级的概念?
代码例子:
实验结果:
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并发方式实现任务时,任务代码的添加方式,追加方式的不同体现了并发执行中也存在潜在先后顺序的问题.并且我们发现在使用最后把线程对象添加到队列组中的方法时,优先级非常的高!!!借此我们可以良好的在并发执行中有选择性的采取不同的添加方式和不同的代码顺序.
验证在设定最大线程队列组为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并发方式实现任务时,任务代码的添加方式,追加方式的不同体现了并发执行中也存在潜在先后顺序的问题.并且我们发现在使用最后把线程对象添加到队列组中的方法时,优先级非常的高!!!借此我们可以良好的在并发执行中有选择性的采取不同的添加方式和不同的代码顺序.
相关文章推荐
- Python3写爬虫(四)多线程实现数据爬取
- C#实现多线程的同步方法实例分析
- 浅谈chuck-lua中的多线程
- C#简单多线程同步和优先权用法实例
- C#多线程学习之(四)使用线程池进行多线程的自动管理
- C#多线程编程中的锁系统(三)
- 解析C#多线程编程中异步多线程的实现及线程池的使用
- C#多线程学习之(六)互斥对象用法实例
- 基于一个应用程序多线程误用的分析详解
- C#多线程学习之(三)生产者和消费者用法分析
- C#多线程学习之(一)多线程的相关概念分析
- C#多线程之Thread中Thread.IsAlive属性用法分析
- 分享我在工作中遇到的多线程下导致RCW无法释放的问题
- C#多线程编程之使用ReaderWriterLock类实现多用户读与单用户写同步的方法
- C#多线程传递参数及任务用法示例
- C#控制台下测试多线程的方法
- 21天学习android开发教程之SurfaceView与多线程的混搭
- Ruby 多线程的潜力和弱点分析
- 探究在C++程序并发时保护共享数据的问题
- C#中WPF使用多线程调用窗体组件的方法