美文网首页
线程间通信

线程间通信

作者: barrylyl | 来源:发表于2015-09-23 14:05 被阅读550次

    #线程间通信(补一个DEMO

    维基百科:指至少两个线程间传送数据或信号的一些方法

    ##线程间通信的体现

    - 一个线程传递数据给另一个线程

    - 在一个线程中执行完特定任务后,转到另一个线程继续执行任务

    ###NSThread

    - 在指定线程上执行操作

    `[self performSelector:@selector(operate) onThread:thread withObject:nil waitUntilDone:YES]`

    - 在主线程上执行操作

    `[self performSelectorOnMainThread:@selector(operate) withObject:nil waitUntilDone:YES]`

    例:子线程下载图片,然后回主线程刷新UI

    ##线程共享内存空间

    - 优点:线程安全,自动加锁

    - 缺点:消耗大量资源(为保证线程安全,会不停加锁)

    ```

    static MyClass _instance

    +(id)shareInstance {

    static dispatch_once_t onceToken;

    dispatch_once (&onceToken, ^{

    if(_instance == nil) _instance = [[MyClass alloc] init];

    });

    return _instance;

    }

    ```

    ##添加线程依赖关系

    - NSOperation:可以利用`NSOperationqueue` 控制单个线程之间关系。

    `addDependency:` 添加依赖关系

    `removeDependency:` 删除依赖关系

    ```

    NSOperationQueue *queue = [[NSOperationQueue alloc] init];

    NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^(){

    NSLog(@"执行NO.1操作,线程:%@", [NSThread currentThread]);

    }];

    NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^(){

    NSLog(@"执行NO.2操作,线程:%@", [NSThread currentThread]);

    }];

    // operation1依赖于operation2  (先执行operation2)

    [operation1 addDependency:operation2];

    [queue addOperation:operation1];

    [queue addOperation:operation2];

    ```

    - GCD: 利用Group监控调度一组线程。

    ```

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    dispatch_async(queue, ^{

    dispatch_group_t group = dispatch_group_create();

    __block UIImage *img1 = nil;

    __block UIImage *img2 = nil;

    dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    img1 = [self loadImg:imgUrl1];

    });

    dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    img2 = [self loadImg:imgUrl2];

    });

    dispatch_group_notify(group, dispatch_get_main_queue(), ^{

    self.imgview1.image = img1;

    self.imgView2.image = img2;

    });

    });

    ```

    ##信号量(semaphore)

    ###如何控制线程并发量

    - NSOperation: 我们可以利用`NSOperationqueue`来控制单个线程间关系, `setMaxConcurrentOperationCount` 这个函数来控制最大并发量。

    ```

    NSOperationQueue *queue = [[NSOperationQueue alloc] init];

    //每次执行‘number’个操作

    [queue setMaxConcurrentOperationCount:number];

    ```

    - GCD: 在GCD中我们可以利用dispatch_semaphore来处理控制并发。

    ####信号量:是一个整形值并且具有一个初始计数值。有两个操作分别为:通知和等待。

    semaphore

    - dispatch_semaphore_create: 创建一个整形数值的信号,即:信号的总量

    - dispatch_semaphore_signal: 发送一个信号,让信号总量增加1

    - dispatch_semaphore_wait: 首先判断信号量是否大于零,如果大于零则减掉1个信号量,往下执行,如果等于零则阻塞该线程

    相关文章

      网友评论

          本文标题:线程间通信

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