美文网首页
iOS Condition

iOS Condition

作者: hunterzhu | 来源:发表于2016-08-04 20:15 被阅读132次

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

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

  • 4.while

    condition =1while condition <10:print(condition)condition...

  • ios网络状态模拟

    Mac OS X 10.7以及iOS 6以后的版本中的一个开发工具——Network Link Condition...

  • SWIFT 对条件编译的支持

    语法 condition的设定 os(para),para可以为OSX, iOS,没有办法设定具体的版本号 arc...

  • if 语句

    if(condition){} 如果condition为真,执行代码块中的语句; if(condition){.....

  • 并发编程-(7)-Condition原理

    目录: 1、Condition介绍1.1、Condition介绍 2、Condition目的 3、Conditio...

  • test 命令

    test condition if [ condition ] ; then commandsfi test 命令...

  • 结构化命令

    if [ condition ]; then elif [ condition ]; then else [ co...

  • SUM和IF混合用法

    格式:IF(Condition,A,B) 意义:当Condition为TRUE时,返回A;当Condition为F...

  • python 炫技

    条件语句 if else ...

网友评论

      本文标题:iOS Condition

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