美文网首页
使用NSCondition实现不同线程等待唤醒

使用NSCondition实现不同线程等待唤醒

作者: Heikki_ | 来源:发表于2017-06-04 20:53 被阅读203次

NSCondition : 一个线程可能需要等待其它线程返回结果.
本例中,使用 condition 对"生产","购买"两个线程加锁,实现
->生产一个商品
->发生一次购买
->再生产一个商品
循环.
[condition wait]之后当前线程会被阻塞直到 [condition signal]
1.生产

@interface Producer : NSObject
@property (nonatomic, assign) BOOL shouldProduce;

@property (nonatomic, strong) NSString *itemName;

@property (nonatomic, strong) NSCondition *condition;

@property (nonatomic, strong) NSMutableArray *collector;

- (instancetype)initWithConditon:(NSCondition *)condition collector:(NSMutableArray *)collector;
- (void)produce;
@end

@implementation Producer

- (instancetype)initWithConditon:(NSCondition *)condition collector:(NSMutableArray *)collector{
    
    self = [super init];
    if (self) {
        self.condition = condition;
        self.collector = collector;
        self.shouldProduce = NO;
        self.itemName = nil;
    }
           return self;
}

-(void)produce{
    self.shouldProduce = YES;
    while (self.shouldProduce) {
        [self.condition lock];
        if (self.collector.count > 0 ) {
            [self.condition wait];
        }
        [self.collector addObject:@"iPhone"];
        NSLog(@"生产:iPhone");
        [self.condition signal];
        [self.condition unlock];
    }
}

2.消费者

#import <Foundation/Foundation.h>

@interface Consumer : NSObject
@property (nonatomic, assign) BOOL shouldConsumer;

@property (nonatomic, strong) NSString *itemName;

@property (nonatomic, strong) NSCondition *condition;

@property (nonatomic, strong) NSMutableArray *collector;
- (instancetype)initWithConditon:(NSCondition *)condition collector:(NSMutableArray *)collector;
- (void)consumer;
@end

#import "Consumer.h"

@implementation Consumer
- (instancetype)initWithConditon:(NSCondition  *)condition collector:(NSMutableArray *)collector{
    
    self = [super init];
    if (self) {
        self.condition = condition;
        self.collector = collector;
        self.shouldConsumer = NO;
        self.itemName = nil;
    }
    return self;
}

-(void)consumer{
    self.shouldConsumer = YES;
    while (self.shouldConsumer) {
        [self.condition lock];
        if (self.collector.count == 0 ) {
            [self.condition wait];
        }
        
        NSString *item = [self.collector objectAtIndex:0];
        NSLog(@"买入:%@",item);
        [self.collector removeObjectAtIndex:0];
        [self.condition signal];
        [self.condition unlock];
    }
}
@end

3.开始抢购

    NSMutableArray *pipeline = [NSMutableArray array];
    NSCondition *conditon = [NSCondition new];
    
    Producer *p = [[Producer alloc]initWithConditon:conditon collector:pipeline];
    Consumer *c = [[Consumer alloc]initWithConditon:conditon collector:pipeline];
    [[[NSThread alloc] initWithTarget:p selector:@selector(produce) object:p] start];
    [[[NSThread alloc] initWithTarget:c selector:@selector(consumer) object:c] start];

4.结束生产,购买

  p.shouldProduce = NO;
  c.shouldConsumer = NO;

5.结果

2017-06-04 20:55:18.051 Condition[63117:2614482] 生产:iPhone
2017-06-04 20:55:18.051 Condition[63117:2614483] 买入:iPhone
2017-06-04 20:55:18.051 Condition[63117:2614482] 生产:iPhone
2017-06-04 20:55:18.052 Condition[63117:2614483] 买入:iPhone
2017-06-04 20:55:18.052 Condition[63117:2614482] 生产:iPhone
2017-06-04 20:55:18.052 Condition[63117:2614483] 买入:iPhone
2017-06-04 20:55:18.053 Condition[63117:2614482] 生产:iPhone
2017-06-04 20:55:18.053 Condition[63117:2614483] 买入:iPhone
2017-06-04 20:55:18.054 Condition[63117:2614482] 生产:iPhone
...
无限循环

form:<高性能iOS应用开发>
(原书中有些错误,此处已修改.不知道是原版还是翻译的锅,这本书里错误巨多)

相关文章

  • 使用NSCondition实现不同线程等待唤醒

    NSCondition : 一个线程可能需要等待其它线程返回结果.本例中,使用 condition 对"生产","...

  • 线程锁

    探讨iOS开发中各种锁使用NSCondition实现多线程同步 NSCondition是线程同步, 阻塞线程。 取...

  • JUC中线程之间得通信

    使用synchronized实现线程间通信,线程间通信:1、生产者+消费者2、通知等待唤醒机制.多线程编程模板:1...

  • 线程核心方法-wait

    ①-1、代码演示使用Object的Notify唤醒wait的线程 ①-2、代码演示使用定时等待唤醒wait的线程 ...

  • 线程间通信

    线程间通信 等待唤醒机制 等待唤醒机制就是用于解决线程间通信的问题的,使用到的3个方法的含义如下:wait():告...

  • 2020-08-03如何实现Java线程的 阻塞/唤醒(和暂停/

    如何实现Java线程的 阻塞/唤醒(和暂停/继续 类似 以下为线程 阻塞/唤醒 主要代码 如何使用?

  • 线程基础

    线程创建的三种方法 ThreadRunnableFutureTask三种线程实现及对比 线程的等待与唤醒 wait...

  • iOS利用NSCondition唤醒/休眠线程

    简介 想了解一个app启动图显示结束之后展示广告资源的需求。即开启一个子线程获取广告资源,LaunchScreen...

  • NSCondition

    NSCondition 是一种特殊类型的锁,通过它可以实现不同线程的调度。一个线程被某一个条件所阻塞,直到另一个线...

  • 音视频开发之旅(53) - Java并发编程 之 synchro

    目录 synchronized的使用方式 synchronized的原理 线程的等待、中断与唤醒 资料 收获 一、...

网友评论

      本文标题:使用NSCondition实现不同线程等待唤醒

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