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

多线程

时间:2015-12-10 15:05:33      阅读:247      评论:0      收藏:0      [点我收藏+]

标签:

 /*CGD开辟多线程我们讲任务放置在队列中
    *DISPATCH_QUEUE_SERIAL线程属性为串行
    *
    *串行队列的异步任务,我们使用的最多
     *
*串行:
     同步:不会开辟多线程,一个接一个执行事件
     异步:一定一定会开辟线程 但是放在串行队列当中的,所以时间执行顺序一件接着一件
     可以保证效率,又可以实现任务并发
*并行:
     同步:不会开辟多线程,一件接着一件
     异步:一定会开辟线程,但是放在并行队列中所有执行顺序是不可控(不建议)
*主队列
     主队列中的同步任务造成线程阻塞,任务无法执行;
    */ #pragma  mark -串行队列
-(void)gcdDemo1{
   
    //创建多线程
   
    dispatch_queue_t q=dispatch_queue_create("com.lamco.one",DISPATCH_QUEUE_SERIAL);
    //开启一个 同步 事件
   
    for(int i=0;i<10;i++){
        dispatch_sync(q, ^{
            //currentThread 可以跟踪当前线程
            NSLog(@"%@ %d",[NSThread currentThread],i);
        });
    }
    //开启一个异步事件
    for(int j=0;j<10;j++){
        dispatch_async(q, ^{
            //currentThread 可以跟踪当前线程
            NSLog(@"%@ %d",[NSThread currentThread],j);
        });
    }
   
    //dispatch_async(<#dispatch_queue_t queue#>, <#^(void)block#>)
   
}
#pragma mark -并行队列
-(void)gcdDemo2{

    dispatch_queue_t q=dispatch_queue_create("hhhhh", DISPATCH_QUEUE_CONCURRENT);
   
    for(int i=0;i<10;i++){
        dispatch_sync(q, ^{
            //currentThread 可以跟踪当前线程
            NSLog(@"%@ %d",[NSThread currentThread],i);
        });
    }
    //开启一个异步事件
    for(int j=0;j<10;j++){
        dispatch_async(q, ^{
            //currentThread 可以跟踪当前线程
            NSLog(@"%@ %d",[NSThread currentThread],j);
        });
    }

}
#pragma mark-全局队列(Apple为了方便多线程设计,提供的全局队列)
-(void)gcdDemo3{
    /**
     *全局队列,不需要我们自己creat,直接get就可以使用
     *@param 第一个参数:线程的优先级,一般用DEFAULT 其他分别:hight ,low,background
     *@param -void 第二个参数传入0就行,apple预留的
     *
     */
    dispatch_queue_t q=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    //开启一个 同步 事件
   
    for(int i=0;i<10;i++){
        //同步事件,顺序执行
        dispatch_sync(q, ^{
            NSLog(@"%@ %d",[NSThread currentThread],i);
        });
    }
    //开启一个异步事件
    //    for(int j=0;j<10;j++){
    //        dispatch_async(q, ^{
    //            //currentThread 可以跟踪当前线程
    //开启一个 异步事件,并发执行,和自己创建的并行队列没有差别,调试的时候没有办法确认
   
    //            NSLog(@"%@ %d",[NSThread currentThread],j);
    //        });
    //    }
   
}
#pragma mark-主队列,保证操作在主线程上执行
-(void)gcdDemo4{
   
    /**
     *每一个应用程序都有一个主线程(因为ios 规定所用ui相关操作都必须在主线程上进行)
     */
    dispatch_queue_t q=dispatch_get_main_queue();
    // 同步事件  线程阻塞(因为主线程是有工作的,除非住线程杀死,否则工作永远不会结束)
    //    dispatch_sync(q, ^{
    //        NSLog(@"hello");
    //    });
    //异步事件在主队列中执行时候是保持队形的
    dispatch_async(q, ^{
        NSLog(@"hello");
    });
}
第一种线程的创建方式
    NSThread *thread1 = [[NSThread alloc]initWithTarget:self selector:@selector(doThread1:) object:nil];
    [thread1 start];
   
    第二种线程创建方式
    [NSThread detachNewThreadSelector:@selector(doThread2:) toTarget:self withObject:@"lhp"];
   
    第三种线程线程创建方式
    [self performSelectorInBackground:@selector(doThread1:) withObject:nil];

 //第四种线程创建方式

    //创建了一个线程队列

//    NSOperationQueue *q = [[NSOperationQueue alloc] init];

//    q.maxConcurrentOperationCount = 3;//设置最大线程并发数

//    //创建线程

//    NSInvocationOperation *opreation1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(doOperation1) object:nil];//

//    NSInvocationOperation *opreation2 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(doThread1:) object:nil];//

//    NSInvocationOperation *opreation3 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(doThread2:) object:nil];//

//    

//    [opreation2 setQueuePriority:NSOperationQueuePriorityVeryHigh];//设置线程的优先级

//    [opreation3 setQueuePriority:NSOperationQueuePriorityVeryLow];

//    

//    [q addOperation:opreation1];

//    [q addOperation:opreation2];

//    [q addOperation:opreation3];

 

    //第五种线程的创建方式

//    dispatch_sync(<#dispatch_queue_t queue#>, <#^(void)block#>)同步事件

//    dispatch_async(<#dispatch_queue_t queue#>, <#^(void)block#>)异步事件

    

//    dispatch_queue_create(<#const char *label#>, <#dispatch_queue_attr_t attr#>)创建线程队列

//    dispatch_release(<#dispatch_object_t object#>)//非ARC的线程队列的内存管理

    

//    dispatch_get_main_queue()获取主队列

//    dispatch_get_global_queue(<#long identifier#>, <#unsigned long flags#>)获取全局队列

    

    

//    dispatch_async(dispatch_get_global_queue(0, 0), ^{

//        NSLog(@"something  %@",[NSThread currentThread]);

//    });

    

//    static dispatch_once_t one;

//    dispatch_once(&one, ^{

//        NSLog(@"onece %@",[NSThread currentThread]);

//    });

    

 

    //延迟执行

//    double time  = 2.0;

//    //NSEC_PER_SEC表示系统的“秒”

//    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, time * NSEC_PER_SEC);

//    dispatch_after(popTime, dispatch_get_main_queue(), ^{

//        //

//    });

//    

//    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

//        //

//    });

    

    

    //线程队列事件的汇总

//    dispatch_group_t group  = dispatch_group_create();

//    dispatch_group_async(group, <#dispatch_queue_t queue#>, <#^(void)block#>)

//    dispatch_group_notify(group, <#dispatch_queue_t queue#>, <#^(void)block#>)

    

    self.queue = [[NSOperationQueue alloc]init];

    

    NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{

        NSLog(@"*1**download image %@",[NSThread currentThread]);

    }];

    

    NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{

        NSLog(@"*2***updata image %@",[NSThread currentThread]);

    }];

    

    NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{

        NSLog(@"*3****save image %@",[NSThread currentThread]);

    }];

    

    NSBlockOperation *op4 = [NSBlockOperation blockOperationWithBlock:^{

        NSLog(@"*4*****show image %@",[NSThread currentThread]);

    }];

    

    //设定执行顺序,dependency依赖,可以跨队列

    [op2 addDependency:op1];

    [op3 addDependency:op2];

    [op4 addDependency:op3];

    

    [self.queue addOperation:op1];

    [self.queue addOperation:op2];

    [self.queue addOperation:op3];

    [[NSOperationQueue mainQueue] addOperation:op4];

    

    

    [self.queue addOperationWithBlock:^{

        //

    }];

    

//    __block int a;

//    int (^myBlock)(int,int)=^(int a,int b){ return a+b;   };

    

}

-(void)doOperation1

{

    NSLog(@"doOperation1:%@",[NSThread currentThread]);

    

    [NSThread isMainThread];//判断是不是主线程

    [NSThread isMultiThreaded];//判断是不是子线程

    

}

-(void)doThread1:(id)sender

{

    NSLog(@"doThread1:%@",[NSThread currentThread]);

}

 

-(void)doThread2:(id)sender

{

    NSLog(@"doThread2:%@ %@",[NSThread currentThread],sender);

}

 

多线程

标签:

原文地址:http://www.cnblogs.com/ningguozhu/p/5035985.html

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