iOS Condition

condition实现多线程的同步
用法:

//
//  ViewController.m
//  demo-NSCondition
//
//  Created by mac on 16/8/4.
//  Copyright © 2016年 mac. All rights reserved.
//

/*实现一个商品生产,消费的任务。
 如果产品的个数为0就停止消费,是消费者处于休眠状态,当生产者生产了之后,唤醒消费者
 如果产品的生产速度大于消费速度,达到一个上届时,使生产者休眠,当消费者消费之后,唤醒生产者。
 使用NSCondition的等待和唤醒方法。
 */

#import "ViewController.h"

@interface ViewController (){
    //1.创建库房,用来存储产品
    NSMutableArray *array ;
    //2.创建一个条件
    NSCondition *condition;
}

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    //分配内存
    array = [[NSMutableArray alloc] init];
    condition = [[NSCondition alloc] init];
    //创建生产者
    [NSThread detachNewThreadSelector:@selector(produceAction) toTarget:self withObject:nil];
    //创建消费者
    [NSThread detachNewThreadSelector:@selector(consumerAction) toTarget:self withObject:nil];
    [NSThread detachNewThreadSelector:@selector(consumerAction) toTarget:self withObject:nil];
    
}
- (void)produceAction{
    
    //异常捕捉
    while (true) {
        

    @try {
        //不管怎么样先上个锁。
        [condition lock];
        while (array.count == 10) {
            NSLog(@"满了,不能再生产了");
            //停止生产,阻塞线程
            [condition wait];
        }
        
        //模拟生产,没0.2~2秒生产一个
        [NSThread sleepForTimeInterval:(arc4random()%10+1)/5.0];
        [array addObject:@"牛奶"];
        //同时打印
        NSLog(@"生产了一个产品,当前个数是:%ld",array.count);
        //唤醒消费者(all)所有的
        [condition broadcast];
        
    }
        //可以打印出异常是什么原因!
    @catch (NSException *exception) {
        
        
    }
    @finally {
        //解锁
        [condition unlock];   
    }
    }
}

- (void)consumerAction{
    
    //异常捕捉
    while (true) {
        @try {
            //不管怎么样先上个锁。
            [condition lock];
            while (array.count == 0) {
                NSLog(@"没有库存了");
                //停止消费,阻塞线程
                [condition wait];
            }
            
            //模拟消费,没0.2~2秒消费一个
            [NSThread sleepForTimeInterval:(arc4random()%10+1)/5.0];
            [array removeLastObject];
            //同时打印
            NSLog(@"消费了一个产品,当前个数是:%ld",array.count);
            //唤醒生产者(all)所有的
            [condition broadcast];
            
        }
        @catch (NSException *exception) {    
        }
        @finally {
            //解锁
            [condition unlock];
            
        }
        
    }
}



- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
iOS Condition_第1张图片
截图

你可能感兴趣的:(iOS Condition)