iOS-有限缓冲问题经典案例-生产者消费者-NSThread多线程

  1 #import "ViewController.h"
  2
  3 @interface ViewController ()
  4 {
  5     NSMutableArray *_arr;
  6     NSCondition *_condition;
  7 }
  8 @end
  9
 10 @implementation ViewController
 11
 12 - (void)viewDidLoad {
 13     [super viewDidLoad];
 14
 15     _arr = [NSMutableArray array];
 16     _condition = [[NSCondition alloc] init];
 17
 18
 19
 20 //    [self addProduct];
 21
 22
 23 //    1:1   2:1
 24     //生产者
 25 //    [NSThread detachNewThreadSelector:@selector(addProduct) toTarget:self withObject:nil];
 26
 27     NSThread *thread1 = [[NSThread alloc] initWithTarget:self selector:@selector(addProduct) object:nil];
 28     [thread1 start];
 29     NSThread *thread3 = [[NSThread alloc] initWithTarget:self selector:@selector(addProduct) object:nil];
 30     [thread3 start];
 31
 32     //消费者
 33 //    [NSThread detachNewThreadSelector:@selector(minProduct) toTarget:self withObject:nil];
 34
 35     NSThread *thread2 = [[NSThread alloc] initWithTarget:self selector:@selector(minProduct) object:nil];
 36     [thread2 start];
 37
 38
 39
 40 }
 41
 42
 43 - (void)addProduct {
 44
 45     while (TRUE) {
 46
 47
 48         [_condition lock];
 49
 50         @try {  //把有可能出现异常的代码放到try{  ..... }
 51 //            Code that can potentially throw an exception
 52
 53 //            [_arr objectAtIndex:1];
 54
 55             while (_arr.count == 10) {
 56
 57                 NSLog(@"库房已满,等待消费");
 58
 59                 //生产者等待,库房有空余位置
 60                 [_condition wait];
 61             }
 62
 63             [NSThread sleepForTimeInterval:.2];
 64             NSObject *obj = [[NSObject alloc] init];
 65             [_arr addObject:obj];
 66
 67             NSLog(@"生产了一个产品,库房总数是%ld",_arr.count);
 68
 69
 70             //唤醒在此NSCondition对象上等待的单个线程 (通知消费者进行消费)
 71             [_condition signal];
 72
 73
 74
 75         }
 76         @catch (NSException *exception) {  //处理try内出现的异常
 77 //            Handle an exception thrown in the @try block
 78
 79             NSLog(@"出现异常 %@",exception);
 80
 81         }
 82         @finally {   //不管是否出现异常 @finally{ ... } 都会执行
 83 //            Code that gets executed whether or not an exception is thrown
 84
 85             NSLog(@"@finally");
 86
 87             [_condition unlock];
 88         }
 89
 90
 91
 92     }
 93
 94 }
 95
 96 - (void)minProduct {
 97
 98     while (TRUE) {
 99
100
101         [_condition lock];
102
103         @try {  //把有可能出现异常的代码放到try{  ..... }
104             //            Code that can potentially throw an exception
105
106             //            [_arr objectAtIndex:1];
107
108             while (_arr.count == 0) {
109
110                 NSLog(@"库房没有产品,等待");
111
112                 //生产者等待,库房有空余位置
113                 [_condition wait];
114             }
115
116
117 //            NSObject *obj = [[NSObject alloc] init];
118 //            [_arr addObject:obj];
119             [_arr removeLastObject];
120
121             NSLog(@"消费了一个产品,库房总数是%ld",_arr.count);
122
123
124             //唤醒在此NSCondition对象上等待的单个线程 (通知生产者进行生产)
125             [_condition signal];
126
127         }
128         @catch (NSException *exception) {  //处理try内出现的异常
129             //            Handle an exception thrown in the @try block
130
131             NSLog(@"出现异常 %@",exception);
132
133         }
134         @finally {   //不管是否出现异常 @finally{ ... } 都会执行
135             //            Code that gets executed whether or not an exception is thrown
136
137             NSLog(@"@finally");
138
139             [_condition unlock];
140         }
141
142
143
144     }
145
146 }
时间: 2024-12-23 20:38:19

iOS-有限缓冲问题经典案例-生产者消费者-NSThread多线程的相关文章

Ruby:线程实现经典的生产者消费者问题

运行结果: ProAndCon 0 produced 1 produced consumed 0 2 produced 3 produced consumed 1 consumed 2 consumed 3 4 produced consumed 4 5 produced consumed 5 转载自:http://www.oschina.net/code/snippet_1045481_33311 Ruby:线程实现经典的生产者消费者问题,布布扣,bubuko.com

生产者消费者中多线程安全问题(即线程间通信的安全问题)

一个生产线程,一个消费线程,程序不存在安全问题 两个生产线程,两个消费线程,出现了生产两次,消费一次或者生产一次,消费两次的情况. 出现问题的原因是:线程被唤醒之后没有回去判断标记,直接继续执行后边的代码. 解决方式:让线程被唤醒之后不是直接执行后边的代码,而是回去判断标志,这个问题可以通过把if改成while实现.          但这样做会出现死锁的状况,原因是唤醒了本方线程,导致所有线程全部等待.          notify()唤醒的是任意一个线程,不能保证唤醒的是对方线程,这个问题

Java学习之线程通信(多线程(synchronized))--生产者消费者

分析线程经典案例生产者消费者 1 /** 2 共享数据 3 */ 4 class Resource 5 { 6 private String name; 7 private int count=1; 8 private boolean flag=false; 9 10 public synchronized void set(String name) 11 { 12 if(flag) 13 try{this.wait();}catch(InterruptedException e){} 14 t

【操作系统】经典的同步问题(生产者消费者问题, 哲学家进餐问题, 读写问题)

用专业术语来说, 进程是程序的一次动态执行.说简单点, 就是进程是系统中的某个任务.操作系统中有多个任务需要执行, 那么怎样执行才能使它们同步呢? 即如何让任务并发执行互不影响呢? 这就引出了进程同步中的经典问题: 生产者消费者问题, 哲学家进餐问题, 读写问题 生产者-消费者问题 有一群生产者进程在生产产品, 并将这些产品提供给消费者进程取消费. 为使生产者进程与消费者进程能并发进行, 在两者间设置了一个具有n个缓冲区的缓冲池, 生产者进程将其所生产的产品翻入缓冲区中, 消费者进程可从一个缓冲

Java多线程15:Queue、BlockingQueue以及利用BlockingQueue实现生产者/消费者模型

Queue是什么 队列,是一种数据结构.除了优先级队列和LIFO队列外,队列都是以FIFO(先进先出)的方式对各个元素进行排序的.无论使用哪种排序方式,队列的头都是调用remove()或poll()移除元素的.在FIFO队列中,所有新元素都插入队列的末尾. Queue中的方法 Queue中的方法不难理解,6个,每2对是一个也就是总共3对.看一下JDK API就知道了: 注意一点就好,Queue通常不允许插入Null,尽管某些实现(比如LinkedList)是允许的,但是也不建议. Blockin

Linux线程编程之生产者消费者问题

前言 本文基于顺序循环队列,给出Linux生产者/消费者问题的多线程示例,并讨论编程时需要注意的事项.文中涉及的代码运行环境如下: 本文假定读者已具备线程同步的基础知识. 一  顺序表循环队列 1.1 顺序循环队列定义 队列是一种运算受限的先进先出线性表,仅允许在队尾插入(入队),在队首删除(出队).新元素入队后成为新的队尾元素,元素出队后其后继元素就成为队首元素. 队列的顺序存储结构使用一个数组和两个整型变量实现,其结构如下: 1 struct Queue{ 2 ElemType elem[M

10 阻塞队列 & 生产者-消费者模式

原文:http://www.cnblogs.com/dolphin0520/p/3932906.html 在前面我们接触的队列都是非阻塞队列,比如PriorityQueue.LinkedList(LinkedList是双向链表,它实现了Dequeue接口). 使用非阻塞队列的时候有一个很大问题就是:它不会对当前线程产生阻塞,那么在面对类似消费者-生产者的模型时,就必须额外地实现同步策略以及线程间唤醒策略,这个实现起来就非常麻烦.但是有了阻塞队列就不一样了,它会对当前线程产生阻塞,比如一个线程从一

Java线程通信-生产者消费者问题

线程通信示例--生产者消费者问题 这类问题描述了一种情况,假设仓库中只能存放一件产品,生产者将生产出来的产品放入仓库,消费者将仓库中的产品取走消费.假设仓库中没有产品,则生产者可以将 产品放入仓库,有产品,则停止生产并等待,直到仓库中的产品被消费这取走为止. 如果仓库中放油产品,则消费者可以将产品取走消费,否则停止消费并等待,直到 仓库中再次放入产品为止. 显然,这是一个同步问题,生产者和消费这共享同一资源, 并且生产者和消费这之间彼此依赖,互为条件向前推进.Java提供了3个方法解决了线程间的

python基础 信号量 semaphore evevt 线程queue 生产者消费者模型

线程锁相当于同时只能有一个线程申请锁,有的场景无数据修改互斥要求可以同时让多个线程同时运行,且需要限制并发线程数量时可以使用信号量 1 import threading, time, queue 2 3 def test(name): 4 semaphore.acquire() #获取信号量锁 5 print('my name is %s' %name) 6 time.sleep(1) 7 semaphore.release() #释放信号量锁 8 9 semaphore = threading