zoukankan      html  css  js  c++  java
  • 多线程的学习和巩固

    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 }
  • 相关阅读:
    数据驱动编程法
    23个设计模式的简明教程
    分享一篇文章C语言字节对齐问题(适用于C++)转载至http://blog.csdn.net/21aspnet/article/details/6729724
    关于C++类中访问权限的若干疑问(虚函数访问权限)
    利用C# 反射设计支持可扩展插件的应用程序
    隐藏控制台console application窗口
    Intellij IDEA社区版上新建项目或模块没有Spring Initializr选项解决办法
    mac jmeter 界面乱码
    windows 查看端口被占用进程
    php static 变量声明
  • 原文地址:https://www.cnblogs.com/wlsxmhz/p/5396195.html
Copyright © 2011-2022 走看看