NSCondition的用法

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] 消费产品

时间: 2024-10-09 07:31:11

NSCondition的用法的相关文章

iOS_多线程(一)

在学习多线程之前首先搞清楚以下几个问题. 并发:在同一时刻,只有一条指令被执行,多条指令进行快速切换执行. 并行:在同一时刻,多个处理器可以处理多条指令 1.什么是进程? 一个运行的程序就是一个进程或一个任务 多个进程之间是具有相互独立的内存空间. 2.什么是线程? 进程当中代码的一个执行路径. 多线程:也就是说代码有多个执行路径. 3.进程与线程的关系? 一个进程至少包含一个线程(主线程),线程是程序的执行流 主线程是其他线程的父线程,所有的界面的显示操作必须在主线程进行. 一个进程中包含多个

Objective-C 关于锁的种类

Objective-C中不同方式实现锁(一) 转载http://www.tanhao.me/pieces/616.html/ 为什么需要使用锁,当然熟悉多线程的你,自然不会对它觉得陌生. 那你在代码中是否很好的使用了锁的机制呢?你又知道几种实现锁的方法呢? 今天一起来探讨一下Objective-C中几种不同方式实现的锁,在这之前我们先构建一个测试用的类,假想它是我们的一个共享资源,method1与method2是互斥的,代码如下: 12345678910111213 @implementatio

js中获取时间new date()的用法

js中获取时间new date()的用法 获取时间:   var myDate = new Date();//获取系统当前时间 获取特定格式的时间: 1 myDate.getYear(); //获取当前年份(2位) 2 myDate.getFullYear(); //获取完整的年份(4位,1970-????) 3 myDate.getMonth(); //获取当前月份(0-11,0代表1月) 4 myDate.getDate(); //获取当前日(1-31) 5 myDate.getDay();

20.5 Shell脚本中的逻辑判断;20.6 文件目录属性判断;20.7 if特殊用法;20.8 20.9 cace判断(上下)

扩展: select用法 http://www.apelearn.com/bbs/thread-7950-1-1.html 20.5 Shell脚本中的逻辑判断 格式1:if 条件 ; then 语句; fi 1. 创建if1.sh测试脚本: [[email protected] ~]# vi if1.sh a=5,如果a大于3,满足这个条件,显示ok 添加内容: #!/bin/bash a=5 if [ $a -gt 3 ] then echo ok fi 2. 执行if1.sh脚本: [[e

20.1 Shell脚本介绍;20.2 Shell脚本结构和执行;20.3 date命令用法;20.4 Shell脚本中的变量

20.1 Shell脚本介绍 1. shell是一种脚本语言 aming_linux blog.lishiming.net 2. 可以使用逻辑判断.循环等语法 3. 可以自定义函数 4. shell是系统命令的集合 5. shell脚本可以实现自动化运维,能大大增加我们的运维效率 20.2 Shell脚本结构和执行 1. 开头(首行)需要加: #!/bin/bash 2. 以#开头的行作为解释说明: 3. 脚本的名字以.sh结尾,用于区分这是一个shell脚本 4. 执行.sh脚本方法有两种:

shell 中seq的用法 echo -n用法

用法:seq [选项]... 尾数 或:seq [选项]... 首数 尾数 或:seq [选项]... 首数 增量 尾数 从1循环到100的两种方法(bash 其它的shell没试过)for x in `seq 1 100`;do echo $x;donefor x in {1..100};do echo $x;done echo -n 不换行输出 $echo -n "123" $echo "456" 最终输出 123456 echo -e 处理特殊字符 若字符串中

sudo的用法

su -l user -C 'COMMAND' 是用user这个用户执行命令 我们一般使用sudo 这个命令 sudo [-u] user COMMAND sudo [-k] COMMAND 清除此前用户的密码. sudo的配置文件/etc/sudoers 配置项为 users    hosts=(runas)    commands users:可以是一个用户的名称也可以是一个组,也可以是一个别名 username #UID user_alias 用户别名的用法 User_Alias NETA

几招学会 Python 3 中 PyMongo 的用法

本文和大家分享的是Python3下MongoDB的存储操作相关内容,在看本文之前请确保你已经安装好了MongoDB并启动了其服务,另外安装好了Python的PyMongo库.下面进入正题,一起来看看吧,希望对大家学习Python3有所帮助. 连接MongoDB 连接MongoDB我们需要使用PyMongo库里面的MongoClient,一般来说传入MongoDB的IP及端口即可,第一个参数为地址host,第二个参数为端口port,端口如果不传默认是27017. import pymongo cl

11 css中分组选择符的用法

<!doctype html> <html> <head> <meta charset="utf-8"> <title>无标题文档</title> <style type="text/css"> h1,span{color:red;} a:hover{color:#2EE926;} /*分组选择符的用法*/ </style> </head> <body&