Objective-C 相当于 Java 的 LinkedBlockingQueue<Long>



我正在用最新的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是否线程安全。

相关内容

  • 没有找到相关文章