多线程

来源:互联网 发布:cef c js 编辑:程序博客网 时间:2024/06/08 00:46

-(void)buttonClick

{

   // [self thread];

    //[self operation];

   // [self gcd];

    //[self gcd2];

    [selfdownloadImage];

}


-(void)downloadImage

{

    dispatch_async(dispatch_get_global_queue(0,0), ^{

        NSData *data = [NSDatadataWithContentsOfURL:[NSURLURLWithString:@"http://www.baidu.com/img/bd_logo1.png"]];

       NSLog(@"下载完成");

        //UI操作要在主线程里面执行

        dispatch_async(dispatch_get_main_queue(), ^{

           _imageView.image = [UIImageimageWithData:data];

        });

    });


}


-(void)gcd2

{

   // 把线程放在一个组里面,可以监听这个组里面的所有线程执行完之后,可以做一些操作

    dispatch_group_t t =dispatch_group_create();

    dispatch_group_async(t,dispatch_get_global_queue(0,0), ^{

        [selffirst];

    });

    dispatch_group_async(t,dispatch_get_global_queue(0,0), ^{

        [selfsecond];

    });

   //t组管理的线程全部结束后会调用这个方法

    //dispatch_get_main_queue() 如果想要在子线程执行完之后,进行刷新UI操作的话,就用主线程

    dispatch_group_notify(t,dispatch_get_global_queue(0,0), ^{

       NSLog(@"全部执行完成");

    });

}


-(void)gcd

{

   //创建一个线程队列

    dispatch_queue_t t =dispatch_queue_create(NULL,NULL);

    dispatch_queue_t t2 =dispatch_queue_create(NULL,NULL);

   //获取一个闲置线程队列

    dispatch_queue_t t3 =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);

   //把操作放在线程队列中,然后执行

    dispatch_async(t, ^{

        [selffirst];

    });

   //当上一个操作被执行完之后,才会执行下一个操作

   //解决方法,把操作放在不同的线程队列中

    dispatch_async(t2, ^{

        [selfsecond];

    });

    dispatch_async(t3, ^{

        [selfthird];

    });

}


-(void)operation

{

    //操作队列

   //queue  把操作加到队列中,操作就是代码段

    NSOperationQueue *queue = [[NSOperationQueuealloc] init];

    queue.maxConcurrentOperationCount =2;

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

       MyOperation *operation = [[MyOperationalloc] init];

        operation.time = i;

        [queueaddOperation:operation];

       //取消操作

        //[operation cancel];

    }

    

}


-(void)thread

{

   //第一种开启线程方法

   NSThread *thread = [[NSThreadalloc] initWithTarget:selfselector:@selector(first)object:nil];

    [threadstart];

    //第二种

    [NSThreaddetachNewThreadSelector:@selector(second)toTarget:selfwithObject:nil];

    //第三种

    [selfperformSelectorInBackground:@selector(third)withObject:nil];

}


-(void)first

{

   sleep(1);

   NSLog(@"1");

}


-(void)second

{

   sleep(2);

   NSLog(@"2");

}


-(void)third

{

   sleep(3);

   NSLog(@"3");

}


0 0
原创粉丝点击