NSCondition用法
使用NSCondition,实现多线程同步。。。举个列子 消费者跟生产者。。。
现在传言6s要出了。。
- 消费者想买6s。现在还没有6s。消费者等待6s生产。
- 生产了一个产品,唤起消费者去买6s。解锁
1 @interface ViewController () 2 /* 3 创建一个数组盛放生产的数据,创建一个线程锁 4 */ 5 @property (nonatomic, strong) NSCondition *condition; 6 @property (nonatomic, strong) NSMutableArray *products; 7 8 @end 9 10 @implementation ViewController 11 #pragma mark - event reponse 12 /* 13 拖拽一个点击事件,创建两个线程 14 */ 15 - (IBAction)coditionTest:(id)sender { 16 NSLog(@"condiction 开始"); 17 [NSThread detachNewThreadSelector:@selector(createConsumenr) toTarget:self withObject:nil]; 18 [NSThread detachNewThreadSelector:@selector(createProducter) toTarget:self withObject:nil]; 19 } 20 21 #pragma mark - provate methods 22 - (void)createConsumenr 23 { 24 [self.condition lock]; 25 while(self.products.count == 0){ 26 NSLog(@"等待产品"); 27 [_condition wait]; 28 } 29 [self.products removeObject:0]; 30 NSLog(@"消费产品"); 31 [_condition unlock]; 32 } 33 34 - (void)createProducter 35 { 36 [self.condition lock]; 37 [self.products addObject:[[NSObject alloc] init]]; 38 NSLog(@"生产了一个产品"); 39 [_condition signal]; 40 [_condition unlock]; 41 } 42 43 #pragma mark - getters and setters 44 - (NSMutableArray *)products 45 { 46 if(_products == nil){ 47 _products = [[NSMutableArray alloc] initWithCapacity:30]; 48 } 49 return _products; 50 } 51 52 - (NSCondition *)condition 53 { 54 if(_condition == nil){ 55 _condition = [[NSCondition alloc] init]; 56 } 57 return _condition; 58 } 59 60 @end
最后附上运行结果
2015-05-27 10:14:32.283 Test-NSCondition[43215:1648129] condiction 开始
2015-05-27 10:14:37.051 Test-NSCondition[43215:1648533] 等待产品
2015-05-27 10:14:37.056 Test-NSCondition[43215:1648534] 生产了一个产品
2015-05-27 10:14:37.056 Test-NSCondition[43215:1648533] 消费产品
自定义垂直拖动的seekbar进度条
android适配pad和部分手机底部虚拟按键+沉浸式状态栏
解决studio的URI is not registered (Setting|Language&Frameworks|Schemas and DTDs)
王者荣耀是怎样炼成的(二)《王者荣耀》unity安装及使用的小白零基础入门
王者荣耀是怎样炼成的(一)《王者荣耀》用什么开发,游戏入门,unity3D介绍
使用python(command line)出现的ImportError: No module named 'xxx'问题
Android Studio生成keystore签名文件步骤讲解
greendao数据库初次使用的配置及多表关联的初始化
android视频双向实时通讯的横竖屏切换