NSOperationQueue没有在iPhone上重用线程

mmi*_*min 5 iphone cocoa multithreading

我正在使用iPhone SDK 3.1.2,以下代码显示NSOperationQueue不会为每个任务重用该线程.

该代码在Snow Leopard上没有任何问题.

- (void)applicationDidFinishLaunching:(UIApplication *)application {    

    // Override point for customization after app launch    
    [window addSubview:viewController.view];
    [window makeKeyAndVisible];

    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    [queue setMaxConcurrentOperationCount:1];
    for(int i = 0; i < 100; i++) {
        NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(run) object:nil];
        [queue addOperation:op];
        [op release];
    }
}

- (void)run {
    static int tc = 0;
    if([[NSThread currentThread] isMainThread]) {
        NSLog(@"MAIN THREAD");
        return;
    } else if([[NSThread currentThread] name] == nil) {
        [[NSThread currentThread] setName:[NSString stringWithFormat:@"THREAD_%d", tc++]];
    }
    NSLog(@"%@", [[NSThread currentThread] name]);
}
Run Code Online (Sandbox Code Playgroud)

输出显示它创建了100个线程来执行100个任务.

2010-01-07 11:46:03.502 OperationQueueTest[7911:4503] THREAD_0
2010-01-07 11:46:03.506 OperationQueueTest[7911:4d03] THREAD_1
2010-01-07 11:46:03.507 OperationQueueTest[7911:4807] THREAD_2
2010-01-07 11:46:03.510 OperationQueueTest[7911:4d07] THREAD_3
2010-01-07 11:46:03.514 OperationQueueTest[7911:5007] THREAD_4
2010-01-07 11:46:03.516 OperationQueueTest[7911:4f0b] THREAD_5
2010-01-07 11:46:03.518 OperationQueueTest[7911:4e0f] THREAD_6
...
2010-01-07 11:46:03.740 OperationQueueTest[7911:4ea7] THREAD_97
2010-01-07 11:46:03.744 OperationQueueTest[7911:4dcf] THREAD_98
2010-01-07 11:46:03.746 OperationQueueTest[7911:460f] THREAD_99
Run Code Online (Sandbox Code Playgroud)

And*_*ing 9

NSOperationQueue旨在以最有效的方式汇集和重用线程,在这种情况下,似乎决定不重用线程是最好的方法.

测试代码有它的用途(你可能已经确定了NSOperationQueue没有做最有效的事情的角落情况),但这并不意味着在现实生活中处理实际代码时NSOperationQueue总是非常低效; 事实上,我自己的经历却恰恰相反.

所以我会说在实际代码中使用它,如果遇到性能问题,请进一步深入研究它在幕后的线程.否则不要担心.

顺便说一句,如果您仍然感到好奇,可以尝试将线程的名称记录到NSStrings数组中,然后在测试代码的末尾打印出所有内容,而不是在进行时记录 - 这将显着减少每个NSInvocationOperation完成的工作量.