您的位置:首页 > 其它

多线程(三)

2016-05-07 19:26 435 查看

下面主要介绍一下GCD(Grand Central Dispatch)的一般用法,理解好的话对以后的多线程开发是非常有帮助的。

个人认为GCD有两大优点

优点一、自动管理线程的生命周期(创建、调度、销毁)

优点二、合理利用CPU内核,达到物尽其用。

核心概念

概念一、任务:执行什么操作 (dispatch_sync:同步,不具备开启线程的能力 dispatch_async: 异步,具备开启线程的能力)

概念二、队列:存放任务(并发队列:多个任务可以同时执行 串行队列:一个任务执行完毕后,再执行下一个任务)

其实,我们但凡用到多线程都希望其具备开启线程的能力,并且不在主线程中操作。(纯属个人理解)一般会用到下面几种方法。

下面的方法偶尔会用到

/**
*  async -- 串行队列(有时候用)
*  会不会创建线程:会,一般只开1条线程
*  任务的执行方式:串行执行(一个任务执行完毕后再执行下一个任务)
*/
- (void)asyncSerialQueue
{
// 1.创建一个串行队列
dispatch_queue_t queue = dispatch_queue_create("queue", NULL);

// 2.将任务添加到串行队列中 异步 执行
dispatch_async(queue, ^{
NSLog(@"-----下载图片1---%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"-----下载图片2---%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"-----下载图片3---%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"-----下载图片4---%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"-----下载图片5---%@", [NSThread currentThread]);
});

}

下面方法常用

/**
*  async -- 主队列(很常用)
*/
- (void)asyncMainQueue
{
// 1.主队列(添加到主队列中的任务,都会自动放到主线程中去执行)
dispatch_queue_t queue = dispatch_get_main_queue();

// 2.添加 任务 到主队列中 异步 执行
dispatch_async(queue, ^{
NSLog(@"-----下载图片1---%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"-----下载图片2---%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"-----下载图片3---%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"-----下载图片4---%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"-----下载图片5---%@", [NSThread currentThread]);
});
}


下面方法最常用,(如我的想法理解一样)

/**
*  async -- 并发队列(最常用)
*  会不会创建线程:会,一般同时开多条
*  任务的执行方式:并发执行
*/
- (void)asyncGlobalQueue
{
// 获得全局的并发队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

// 将 任务 添加 全局队列 中去 异步 执行
dispatch_async(queue, ^{
NSLog(@"-----下载图片1---%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"-----下载图片2---%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"-----下载图片3---%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"-----下载图片4---%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"-----下载图片5---%@", [NSThread currentThread]);
});
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: