美文网首页
多线程的方法

多线程的方法

作者: 广益散人 | 来源:发表于2015-11-20 20:53 被阅读35次

    多线程分为GCD,NSOperation和NSThread。GCD底层是用C语言实现的,NSOperation是对GCD轻量级的封装。NSThread是比较原始的方法了。

    1、GCD创建多线程

    首先,我们需要创建一个队列,队列根据不同的需要创建为串行队列和并行队列

    dispatch_queue_t  q = dispatch_queue_create("xiancheng",DISPATCH_QUEUE_CONCURRENT)

    函数中第一个参数是当前队列的名称,第二个参数是创建队列的类型:DISPATCH_QUEUE_CONCURRENT为并行队列,DISPATCH_QUEUE_SERIAL为串行队列。

    另外,队列还有主队列和全局队列。

    主队列:dispatch_queue_t  queue =  dispatch_get_main_queue();获取主线程队列,在主线程更新UI。

    全局队列:dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0)

    接下来我们可以使用dispatch_async或dispatch_sync函数来加载需要运行的任务。

    同步线程:

    dispatch_sync(queue,^{

    block的具体代码(即需要执行的任务)

    });

    同步执行任务代码,不会返回函数,知道block中的代码执行完毕。嵌套使用时容易引起死锁。

    异步线程:

    dispatch_async(queue,^{

    block中的任务代码

    });

    异步执行block,函数立即返回。

    NSOperation:

    同样的,NSOperation需要一个队列

    在.m文件中,输入以下内容:

    #import “ViewController.h”

    @interface ViewController()

    @property(noatomic,strong) NSOperationQueue *myQueue;

    @end

    @implementation ViewController

    -(void)viewDidLoad{

    [super viewDidLoad];

    初始化队列

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

    }

    创建一个线程

    [self.myQueue addOperationWithBlock:^{

    Block中的任务代码

    }]

    在主线程中执行任务

    [NSOperationQueue mainQueue] addOperationWithBlock:^{

    block中的任务代码

    }];

    多个线程时,设置线程的执行顺序

    NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{

    任务代码

    }];

    NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{

    任务代码

    }];

    NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{

    任务代码

    }];

    假设我们需要线程的执行顺序为:op1,op2,op3.

    思想就是线程2依赖于线程1,等线程1执行完毕后执行线程2.

    [op2 addDependency:op1];

    [op3 addDependency:op2];

    将线程依次添加到队列中

    [self.myQueue addOperation:op1]

    [self.myQueue addOperation:op2]

    [self.myQueue addOperation:op3]

    @end

    相关文章

      网友评论

          本文标题:多线程的方法

          本文链接:https://www.haomeiwen.com/subject/evzqhttx.html