我正在使用最新的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
,但我不知道如何模仿阻塞等。
有什么建议吗?
答案 0 :(得分:0)
没有等效的AFAIK,你需要自己动手。
我想我可能会使用dispatch semaphore。
使用实例变量创建一个类,该实例变量是队列中的项目列表(NSMutableArray
可能是一个很好的候选者)。该类还应该有一个实例变量,它是一个调度信号量。
在-init
初始化数组和信号量,初始计数为零。
创建两个方法,一个用于排队元素,另一个用于使元素出列。 添加元素后,enqueue还必须发出信号量的信号。在删除元素之前,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是否是线程安全的。