iOS 多线程与线程锁

</pre><pre name="code" class="html"><span style="font-size:18px;">区别</span>
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        // 处理耗时操作的代码块...
        UIImage *image = [UIImage imageNamed:@"bb.jpg"];
        UIImageView *imageV = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 160, 240)];
        [imageV setImage:image];
        [self.view addSubview:imageV];
        sleep(3);
        //通知主线程刷新
        dispatch_async(dispatch_get_main_queue(), ^{
            //回调或者说是通知主线程刷新,
            
            NSLog(@"update main");
        });
        
    });

以上代码在子线程添加视图  要许久(大于3秒)之后才能在UI上显示图片
===========================================================================================
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        // 处理耗时操作的代码块...
        UIImage *image = [UIImage imageNamed:@"bb.jpg"];
        UIImageView *imageV = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 160, 240)];
        [self.view addSubview:imageV];
        sleep(3);
        //通知主线程刷新
        dispatch_async(dispatch_get_main_queue(), ^{
            //回调或者说是通知主线程刷新,
            [imageV setImage:image];
            NSLog(@"update main");
        });
        
    });
以上代码在子线程添加视图  然后3秒后通知主线程更新UI(正常做法)


[NSThread detachNewThreadSelector:@selector(aa) toTarget:self withObject:nil];

-(void)aa
{
    sleep(3);
    UIImage *image = [UIImage imageNamed:@"bb.jpg"];
    UIImageView *imageV = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 160, 240)];
    if(image!=nil)
    {
        //跟新主线程(线程的通信)
        [self performSelectorOnMainThread:@selector(updateUI:) withObject:image waitUntilDone:YES];
    }      [self.view addSubview:imageV];
}



以上效果类似于第二种

开启一个线程:dispatch_async


全局线程队列:dispatch_get_global_queue(0, 0)

优先级:2 ,0, -2

主线程: dispatch_get_main_queue()




线程锁

    //线程1
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
         sleep(4);
       [self method1];
    });
    //线程2
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
         sleep(1);
        [self method2];
    });
以上代码的结果:

2014-07-22 21:23:35.663 demo[13769:3603] method2

2014-07-22 21:23:38.663 demo[13769:3503] method1

  NSLock *lock = [[NSLock alloc] init];
    dispatch_async(dispatch_get_global_queue(0,0), ^{
        @synchronized(lock){
            sleep(4);
            [self method1];
        }
        @synchronized(lock){
            sleep(1);
            [self method2];
        }
    });
以上代码结果:

2014-07-22 21:24:17.498 demo[13787:3503] method1

2014-07-22 21:24:18.500 demo[13787:3503] method2


NSLock

 NSLock *lock = [[NSLockalloc]init];

     

 //线程1

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{

        sleep(4);

        [locklock];

        [selfmethod1];

        [lockunlock];

       sleep(1);

        [locklock];

        [selfmethod2];

        [lockunlock];

    });

以上代码结果:

2014-07-22 21:27:22.029 demo[13837:3503] method1

2014-07-22 21:27:23.030 demo[13837:3503] method2







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

       NSLog(@"延迟2秒调用");

    });

    

    

    /* 1.dispatch_async 异步处理好使的操作  */

    

    //获取全局队列(三种)

    dispatch_queue_t golbalQ =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);

    

    dispatch_queue_t mainQ =dispatch_get_main_queue();

    

    dispatch_async(dispatch_get_global_queue(0,0), ^{

        NSLog(@"开启子线程:dispatch_get_global_queue");

       sleep(3);

        dispatch_async(dispatch_get_main_queue(), ^{

             NSLog(@"更新主线程:dispatch_get_main_queue");

        });

    });

    

   /*

     2dispatch_group_async的使用

      dispatch_group_async可以实现监听一组任务是否完成,完成后得到通知执行其他的操作。这个方法很有用,比如你执行三个下载任务,当三个任务都下载完成后你才通知界面说完成的了

     */

    dispatch_group_t group =dispatch_group_create();

    dispatch_queue_t queue =dispatch_get_global_queue(0,0);

   dispatch_group_async(group, queue, ^{

       sleep(1);

        NSLog(@"group1-随机执行");//随机执行

    });

   dispatch_group_async(group, queue, ^{

       sleep(1);

        NSLog(@"group2-随机执行");//随机执行

    });

   dispatch_group_async(group, queue, ^{

       sleep(1);

        NSLog(@"group3-随机执行");//随机执行

    });

   dispatch_group_notify(group, queue, ^{

        NSLog(@"update(只有等上面三个group1,group2,group3执行完毕之后才会调用)");

    });

    

   /*

     3dispatch_barrier_async的使用

     dispatch_barrier_async是在前面的任务执行结束后它才执行,而且它后面的任务等它执行完成之后才会执行

     */

    

    

//    dispatch_queue_t queueBarrier = dispatch_get_global_queue(0, 0);

    //queueBarrier这个队列不能是全局的dispatch_get_global_queue(0, 0)必须自己定义一个队列

   dispatch_queue_t queueBarrier =dispatch_queue_create("gcdtest.rongfzh.yc",DISPATCH_QUEUE_CONCURRENT);

   dispatch_async(queueBarrier, ^{

       sleep(1);

       NSLog(@"b1随机执行");

    });

   dispatch_async(queueBarrier, ^{

       sleep(1);

       NSLog(@"b2随机执行");

    });

    dispatch_barrier_async(queueBarrier, ^{

       sleep(0);

        NSLog(@"dispatch_barrier_async只有等之前做的做完才会执行后面的线程至于它执行完毕后才执行");

    });

   dispatch_async(queueBarrier, ^{

       sleep(1);

       NSLog(@"b3随机执行");

    });

    

   /*

     4dispatch_apply

        执行某个代码片段N次。

     */

    dispatch_apply(5,dispatch_get_global_queue(0,0), ^(size_t index) {

       sleep(1);

       NSLog(@"dispatch_apply执行某个代码片段5  %ld",index);

    });

    



 /**

     *  只会执行一次

     */

   static dispatch_once_t onceToken;

   dispatch_once(&onceToken, ^{

       sleep(1);

        NSLog(@"dispatch_once 只会执行一次");

    });



//创建一个信号量:2

    dispatch_semaphore_t semaphores  =  dispatch_semaphore_create(2);

    for (int i = 0; i<10; i++) {

        

       dispatch_async(dispatch_get_global_queue(0, 0), ^{

            NSLog(@"====  %d",i);

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

               //释放资源  发出信号量

               //dispatch_semaphore_signal(semaphores);

           });

          

       });

    }

    //等待资源

    dispatch_semaphore_wait(semaphores, DISPATCH_TIME_FOREVER);

    dispatch_semaphore_wait(semaphores, DISPATCH_TIME_FOREVER);

    //当没有资源释放的时候 线程就堵住了

    dispatch_semaphore_wait(semaphores, DISPATCH_TIME_FOREVER);



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值