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