0

我正在使用最新的 SDK 开发一个 iOS 应用程序,我必须LinkedBlockingQueue使用 Objective-C 实现一个。

我必须做这样的代码:

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,但我不知道如何模拟阻塞等。

有什么建议吗?

4

1 回答 1

0

没有等效的 AFAIK,您需要自己动手。

我想我可能会使用dispatch semaphore

创建一个具有实例变量的类,该实例变量是队列中的项目列表(NSMutableArray可能是一个很好的候选者)。该类还应该有一个作为分派信号量的实例变量。在-init初始化数组和信号量时,初始计数为零。

创建两种方法,一种使元素入队,另一种使元素出队。添加元素,入队还必须向信号量发出信号。在移除元素之前,出队必须等待信号量。

代码看起来像这样:

@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 是否是线程安全的。

于 2013-04-02T11:11:51.323 回答