マルチスレッドプログラミング-NSthread


マルチスレッドプログラミング-NSthread
各iOSアプリケーションには、UIインタフェースを更新したり、ユーザーのタッチイベントを処理したりするためのプライマリ・スレッドがあります.そのため、他の時間のかかる操作をプライマリ・スレッドに置いて実行することはできません.そうしないと、プライマリ・スレッドが詰まったり(カード現象が発生したり)、極めて悪いユーザー・ボリュームをもたらします.一般的な解決策は、それらの時間のかかる操作を別のスレッドに入れて実行することであり、マルチスレッドプログラミングはメインスレッドの詰まりを防止し、実行効率を高める最善の方法iOSは複数の階層のマルチスレッドプログラミングをサポートし、階層が高いほど抽象度が高く、使用も便利であり、アップルが最も推奨する方法でもある.iOSでサポートされているマルチスレッドプログラミング方法を、抽象階層の低~高の順にリストします.
  • Thread:3つの方法のうち比較的軽量レベルですが、スレッドのライフサイクル、同期、ロックの問題を管理する必要があります.これにより、一定のパフォーマンスオーバーヘッド
  • が発生します.
  • Cocoa Operations:OCに基づいて実現され、NSOperationは実行する必要がある操作をオブジェクト向けにカプセル化しており、スレッド管理、同期などの問題に関心を持つ必要はありません.NSOperationは抽象ベースクラスであり、iOSはNSInvocationOperationとNSBlockOperationの2つのデフォルト実装を提供している.もちろんNSOperation
  • をカスタマイズすることもできる.
  • Grand Central Dispatch(GCD、iOS 4と略称してサポートを開始):マルチコアパラレルプログラミングをサポートするためにいくつかの新しい特性を提供し、ライブラリを実行します.その注目点はより高いです.複数のcpuで効率を向上させる方法
  • マルチスレッドの原理は同じ時間で、CPUは1つのスレッドしか処理できず、1つのスレッドだけが動作(実行)マルチスレッド同時(同時)に実行されるが、実はCPUが複数のスレッドの間で迅速にスケジューリング(切り替え)することである.CPUがスレッドをスケジューリングする時間が十分に速ければ、マルチスレッド同時実行の仮象をもたらす.この文章では、第1のマルチスレッドプログラミングの方式を簡単に紹介した.主にNSThreadというクラスを利用しており、1つのNSThreadインスタンスはスレッドを表しています.
    一、NSthreadの初期化
  • ダイナミックメソッド
  • - (instancetype)initWithTarget:(id)target selector:(SEL)selector object:(nullable id)argument 
        NSThread * thread1 = [[NSThread alloc] initWithTarget:self selector:@selector(doAction) object:nil];
        //   
        thread1.name = @"thread1";
        //     ,0 ~ 1
        thread1.threadPriority = 1.0;
        //    
        [thread1 start];

    パラメータ解析:selector:スレッド実行方法、このselectorは最大1つのパラメータtarget:selectorメッセージ送信のオブジェクトargumentしか受信できません:selectorに送信される一意のパラメータ、またはnil
  • 静的方法
  • + (void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(nullable id)argument;
    //         ,       start
        [NSThread detachNewThreadSelector:@selector(doAction) toTarget:self withObject:nil];
  • スレッドを暗黙的に作成する方法:
  •     //       
        [self performSelectorInBackground:@selector(doAction:) withObject:@"CYY"];

    スレッドの取得
        //      
        NSThread *current = [NSThread currentThread];
        //     
        NSString *main = [NSThread mainThread];

    メインスレッドNSLog(@"mainThread - %@",[NSThread mainThread]);
    は、サブスレッドで取得可能である
    現在のスレッドを一時停止
            //    
            [NSThread sleepForTimeInterval:2];
            [NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:2]];
    

    強制停止スレッド[NSThread exit];注意:スレッドが停止(死亡)すると、タスクを再開できません.
    スレッド間通信
    メインスレッド実行アクション
        [self performSelectorOnMainThread:@selector(changeMainThread:) withObject:image waitUntilDone:NO];

    指定したスレッドでの操作
       [self performSelector:@selector(changeMainThread:) onThread:[NSThread mainThread] withObject:image waitUntilDone:YES];
    

    現在のスレッドでの操作
       [self performSelector:@selector(setImage:) withObject:nil]

    waitUntilDone:どういう意味ですか.YES:loadImageを待つ:このメソッドの実行が完了した後、現在のスレッドの後続の操作を実行するNO:loadImageを待たない:このメソッドの実行が完了したら、現在のスレッドの後続の操作を実行する
    例:チケット販売の問題は2つのスレッドがあり、2つのスレッドの間で同時に行うことはできません.反発ロックが必要です.
    - (void)viewDidLoad {
        [super viewDidLoad];
    
        self.tickets = 20;
    
        NSThread * thread1 = [[NSThread alloc] initWithTarget:self selector:@selector(saleTicket) object:nil];
    // thread1.name = @"computer";
    
        [thread1 start];
    
    
        NSThread * thread2 = [[NSThread alloc] initWithTarget:self selector:@selector(saleTicket) object:nil];
    // thread2.name = @"phone";
    
        [thread2 start];
    }
    
    - (void)saleTicket {
    
        while (1) {
    
       //   
       @synchronized(self) {
    
           [NSThread sleepForTimeInterval:2];
    
           if (self.tickets > 0) {
    
               NSLog(@"%@      %@  ",[NSThread currentThread],@(self.tickets));
    
               self.tickets -- ;
    
           } else {
    
               NSLog(@"    ");
    
               break;
           }   
       }        
    }    
    }

    NSThreadのメリットとデメリット
    1、利点:NSThreadは他の2つのマルチスレッド方式より軽量級で、スレッドオブジェクトをより直感的に制御する2、欠点:スレッドのライフサイクルを自分で管理し、スレッドを同期する必要がある.スレッド同期によるデータのロックには、システムオーバーヘッドが発生します.
    マルチスレッドのメリットとデメリット
    一、マルチスレッドの利点1、プログラムの実行効率を適切に高めることができる2、リソース利用率(CPU、メモリ利用率)を適切に高めることができる
    二、マルチスレッドの欠点1、オープンスレッドは一定のメモリ空間を占有する必要がある(メインスレッド:1 M、その他のスレッド512 kb)、大量のスレッドを開くと、大量のメモリ空間を占有し、プログラムの性能を低下させる2、スレッドが多ければ多いほど、CPUのスケジューリングスレッドでのオーバーヘッドが大きくなる3、プログラム設計がより複雑になる:例えばスレッド間の通信、マルチスレッドのデータ共有