码迷,mamicode.com
首页 > 编程语言 > 详细

多线程的学习和巩固

时间:2016-04-15 18:05:51      阅读:190      评论:0      收藏:0      [点我收藏+]

标签:

NSThread

 

-(void)commonThread
{
    /**
     使用NSThread感觉不方便的地方就是每次使用线程都得创建一个新的方法。不过它的方法好记,简单易用,只是功能上有点弱。
     */
    //NSThread的两种使用
    //1.
    NSThread *thread1 = [[NSThread alloc]initWithTarget:self selector:@selector(readNUm1) object:nil];
    [thread1 start];
    //2.
    [NSThread detachNewThreadSelector:@selector(loadThreadArgumentWithStr:) toTarget:self withObject:@"argument"];

    //回到主线程中做一些事情(UI只能在主线程中刷新,当然干点别的肯定也是可以的)
    [self performSelectorOnMainThread:@selector(readNum2) withObject:nil waitUntilDone:NO];

    //NSObject - 对象的某个方法可以直接在后台运行
    [self performSelectorInBackground:@selector(loadThreadArgumentWithStr:) withObject:@"NSobjectThread"];
}

 

 

NSOperation&NSOperationQueue

 

//NSOperationQueue会建立一个线程管理器,每个加入到线程operation会有序的执行。
-(void)loadOperation
{
    /**
    [XXXXX new] ~= [[XXXX alloc]init]   new是隐式调用了init,如果使用alloc/init 我们可以定制initXXX
     */
    NSOperationQueue *queue = [NSOperationQueue new];
    //设置线程最大并发数
    [queue setMaxConcurrentOperationCount:2];
    
    NSInvocationOperation *operation =[[NSInvocationOperation alloc] initWithTarget:self selector:@selector(threadReadNums) object:nil];
    NSInvocationOperation *operation2 =[[NSInvocationOperation alloc] initWithTarget:self selector:@selector(threadReadNums2) object:nil];
    NSInvocationOperation *operation3 =[[NSInvocationOperation alloc] initWithTarget:self selector:@selector(threadReadNums) object:nil];
    [queue addOperation:operation];
    [queue addOperation:operation2];
    [queue addOperation:operation3];
    
    
    NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{
        for (int i=0; i<10; i ++)
        {
            NSLog(@"NSBlockOperation -->%zi",i);
        }
    }];
    [queue addOperation:blockOperation];
}

 

 添加依赖关系

-(void)AddPriorityOperation
{
    NSOperationQueue *queue = [NSOperationQueue new];
    NSBlockOperation *blockOperation1 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"blockOperation 1");
    }];
    
    NSBlockOperation *blockOperation2 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"blockOperation 2");
    }];
    
    NSBlockOperation *blockOperation3 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"blockOperation 3");
    }];
    
    NSBlockOperation *blockOperation4 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"blockOperation 4");
    }];
    
    NSBlockOperation *blockOperation5 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"blockOperation 5");
    }];
    
    NSBlockOperation *blockOperation6 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"blockOperation 6");
    }];
    
    [blockOperation6 setQueuePriority:NSOperationQueuePriorityHigh];
    
    [blockOperation6 addDependency:blockOperation1];//依赖关系优于优先级的设定
    [blockOperation1 addDependency:blockOperation2];
    [blockOperation2 addDependency:blockOperation3];
    [blockOperation3 addDependency:blockOperation4];
    [blockOperation4 addDependency:blockOperation5];
    
    [queue setMaxConcurrentOperationCount:6];
    [queue addOperation:blockOperation1];
    [queue addOperation:blockOperation2];
    [queue addOperation:blockOperation3];
    [queue addOperation:blockOperation4];
    [queue addOperation:blockOperation5];
    [queue addOperation:blockOperation6];
}

 GCD的使用

 

 1 -(void)dispatchMethods
 2 {
 3     //1.后台执行
 4     dispatch_async(dispatch_get_global_queue(0, 0), ^{
 5         //dosomething
 6     });
 7     //2.主线程执行
 8     dispatch_async(dispatch_get_main_queue(), ^{
 9         //dosomething
10     });
11     //3.一次执行
12     static dispatch_once_t onceToken;
13     dispatch_once(&onceToken, ^{
14         //代码会被执行一次
15     });
16     //4.延时执行
17     dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, 2.0 * NSEC_PER_SEC);
18     dispatch_after(time, dispatch_get_main_queue(), ^(void){
19         //2秒后执行
20     });
21     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
22         //2秒后执行
23     });
24     //5.自定义方式 使用idspatch_queue_create方法
25     dispatch_queue_t urls_queue = dispatch_queue_create("url", NULL);
26     dispatch_async(urls_queue, ^{
27         //执行代码
28     });
29     //6.在后台并行执行多个线程,并在执行完后汇总执行结果,
30     //用dispatch_group,dispatch_async和dicpatch_group_notify实现
31     dispatch_group_t group = dispatch_group_create();
32     dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
33         //线程任务一
34     });
35     dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
36         //线程任务二
37     });
38     dispatch_group_notify(group, dispatch_get_global_queue(0, 0), ^{
39         //汇总结果。。。在所有group中的线程任务都完成后会执行该方法
40     });
41 }

 

多线程的学习和巩固

标签:

原文地址:http://www.cnblogs.com/wlsxmhz/p/5396195.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!