【Objective-C】マルチスレッド

3939 ワード

(一)スレッド:
NSThreadクラスの使用、直接コード:
-(void)testThread1 {
    NSString *param = @"Task 1";
    // 
    NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(onExecuteTask1:) object:param];
    // 
    [thread start];
    
    // , 
    [NSThread sleepForTimeInterval:3];
}

-(void)onExecuteTask1:(NSString *) param{
    @autoreleasepool {
        [NSThread sleepForTimeInterval:1];
        NSLog(@"thread = %@, param = %@", [NSThread currentThread], param);
    }
}

注意1:新規スレッドのparamパラメータは必須ではありません.
注意2:サブスレッドのメモリ管理はサブスレッドが自分で担当します.ここでは@autoreleasepoolを使用して自動解放処理を行います.
また、NSThreadクラスではNSObject(NSThreadPerformAdditions)カテゴリが定義されているので、任意のオブジェクトクラスでは、以下の方法でスレッドの役割を果たすことができます.
// @selector 
- (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg;
// @selector , iOS , UI 
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;

(二)スレッドプール
NSOperationクラス:Java言語のRunnableまたはCallbackに相当する実行するタスクと理解できます.
NSOperationQueueクラス:タスク実行キュー、スレッドプール.タスクプールは、NSOperationインスタンスを追加したり、コードブロックを追加したりすることができます.次の2つの方法の定義を示します.
- (void)addOperation:(NSOperation *)op;
- (void)addOperationWithBlock:(void (^)(void))block;

Javaでは、RunnableインタフェースまたはCallbackインタフェースを実装するタスククラスを定義します.同様に、Objective-Cでは、クラス継承NSOperationクラスを定義し、main()メソッドが対応する時間消費コードを実行することを実現することができる.次のようになります.
#import 

@interface MyOperation : NSOperation {
    NSString *_param;
}

-(id)initWithParam:(NSString *)param;

@end
#import "MyOperation.h"

@implementation MyOperation

-(id)initWithParam:(NSString *)param {
    if(self = [super init]) {
        _param = param;
    }
    return self;
}

-(void)main {
    @autoreleasepool {
        [NSThread sleepForTimeInterval:1];
        NSLog(@"thread = %@, param = %@", [NSThread currentThread], _param);
    }
}

@end

また、Objective-CにはNSInvocationOperationクラスが付属しており、NSOperationクラスから継承されている.NSThreadと同様の方法を非同期で実行するのに便利です.次のようになります.
NSInvocationOperation *task_a = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(onExecuteTask2:) object:param_a];

完全なコードは次のとおりです.
-(void)testThread2 {
    NSString *param_a = @"Task 2 a";
    NSString *param_b = @"Task 2 b";
    NSString *param_c = @"Task 2 c";
    // 
    NSInvocationOperation *task_a = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(onExecuteTask2:) object:param_a];
    NSOperation *task_b = [[MyOperation alloc] initWithParam:param_b];
    // : b a
    [task_a addDependency:task_b];
    // 
    NSOperationQueue *taskQueue = [[NSOperationQueue alloc] init];
    // 
    //NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];
    // 
    [taskQueue setMaxConcurrentOperationCount:3];
    // (NSOperation ) , 
    [taskQueue addOperation:task_a];
    [taskQueue addOperation:task_b];
    // ( ) , 
    [taskQueue addOperationWithBlock:^{
        NSLog(@"%@", param_c);
    }];
    
    // , 
    [NSThread sleepForTimeInterval:3];
}

-(void)onExecuteTask2:(NSString *) param {
    @autoreleasepool {
        [NSThread sleepForTimeInterval:1];
        NSLog(@"thread = %@, param = %@", [NSThread currentThread], param);
    }

}

(三)GCD
Grand Central Dispatch(GCD)はAppleが開発したマルチコアプログラミングの新しい解決策である.マルチコアプロセッサや他の対称マルチプロセッサシステムをサポートするために、主にアプリケーションを最適化するために使用されます.これは、オンライン・スレッド・プール・モードに基づいて実行されるパラレル・タスクです.GCDの関連メソッドは、いずれも「dispatch_」開発、たとえばiOSアプリケーションを開発する際によく使用されるコードは、次のとおりです.
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){
    // 
    dispatch_async(dispatch_get_main_queue(), ^(void){
        //UI 
    });
});

@容新華技術ブログ-http://blog.csdn.net/rongxinhua-オリジナル記事、転載は出典を明記してください