我正在用最新的SDK开发一个iOS应用程序,我必须用Objective-C实现LinkedBlockingQueue
。
我必须做这样的代码:
public boolean onEvent(final EventArgs e) {
if (e.getClass() != this.eventType) return false;
long now = android.os.SystemClock.uptimeMillis();
long diff = now - this.last;
final long threadExecutionTimeMs = now - lastThreadExecution;
if (executions.remainingCapacity() == 0)
{
executions.poll();
}
executions.add(threadExecutionTimeMs);
...
}
可能我可以使用NSMutableArray
,但我不知道如何模拟阻塞等。
任何建议吗?
没有等效的,您需要自己制作。
我想我可能会使用分派信号量。
创建一个具有实例变量的类,该实例变量是队列中的项目列表(NSMutableArray
可能是一个很好的候选)。类还应该有一个实例变量,它是一个分派信号量。在-init
中,初始化数组和信号量的初始计数为零。
创建两个方法,一个用于使元素加入队列,另一个用于使元素脱离队列。队列还必须在添加元素后向信号量发出信号。在移除元素之前,dequeue必须等待信号量。
代码看起来像这样:
@implementation MyQueue
{
NSMutableArray* myArray;
dispatch_semaphore_t fd_sema;
}
-(void) enqueue (id) anObject
{
@synchronized(myArray)
{
[myArray addObject: anObject];
}
dispatch_semaphore_signal(fd_sema);
}
-(id) dequeue
{
dispatch_semaphore_wait(fd_sema, DISPATCH_TIME_FOREVER);
id ret = nil;
@synchronized(myArray)
{
ret = [myArray objectAtIndex: 0];
[myArray removeObjectAtIndex: 0];
}
return ret;
}
信号量有效地计算数组中对象的数量。dispatch_semaphore_signal()
增加信号量。dispatch_semaphore_wait()
减少信号量,除非它已经为零,在这种情况下,线程停止,直到其他东西发出信号量。
对数组本身的访问是同步的,因为a)否则会有从队列中删除某些东西的竞争条件,b)我不能费心去查找NSMutableArray是否线程安全。