ios线程的五种使用方式

 //第一种方式  手动创建并启动
    NSThread *t = [[NSThread alloc] initWithTarget:self selector:@selector(method) object:nil];
    [t start];
    
    //第二种方式  类方法
    [NSThread detachNewThreadSelector:@selector(method) toTarget:self withObject:nil];
    
    //第三种方式  类方法
    [self performSelectorInBackground:@selector(method) withObject:nil];
    
    //第四种方式 block 语法
    NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init];
    //会开启一个多线程,调用block
    [operationQueue addOperationWithBlock:^{
        for (int i=0; i<50; i++) {
            NSLog(@"多线程:%d", i);
        }
    }];
    
    //第五种  线程队列(线程池)
    NSOperationQueue *operationQueue2 = [[NSOperationQueue alloc] init]; //相当于一个线程池,里面可以放很多线程,这个线程池管理多个线程的调度,可以给线程设置优先级,并发数
    operationQueue2.maxConcurrentOperationCount = 1;  //设置最大并发数量(并发=同时进行)
    
    //创建线程
    NSInvocationOperation *operation1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(thread1) object:nil];
    //设置线程的优先级
    [operation1 setQueuePriority:NSOperationQueuePriorityVeryLow];
    
    NSInvocationOperation *operation2 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(thread1) object:nil];
    [operation2 setQueuePriority:NSOperationQueuePriorityVeryHigh];
    
    //将线程添加到线程池
    [operationQueue2 addOperation:operation1];
    [operationQueue2 addOperation:operation2];
    
    
    //----------------------回到主线程--------------------------------
    
    //在多线程中可能加载数据,加载完了之后要刷新ui, ui必须在主线程上面操作,在多线程的方法中这样调用
    [self performSelectorOnMainThread:@selector(thread1) withObject:nil waitUntilDone:YES];
    
    
    //-----------------第六种线程的使用方式--------------
    //这个函数是C的函数,字符串test也要用C里面的字符串,是不带@符号的
    dispatch_queue_t queue = dispatch_queue_create("test", NULL);
    dispatch_async(queue, ^{
        for (int i=0; i<50; i++) {
            NSLog(@"多线程:%d", i);
        }
        //回到主线程执行
        dispatch_async(dispatch_get_main_queue(), ^{
            if ([NSThread isMainThread]) {
                NSLog(@"是主线程");
            }
        });
    });
-(void)thread1 {
    //这里是开启了一个新的线程,所以新的线程跟主线程脱离关系了,这个里面的内存管理,我们需要自己创建一个自动释放池
    //创建自动释放池
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    
    NSLog(@"执行多线程");
    
    [pool release];
}

猜你喜欢

转载自duchengjiu.iteye.com/blog/1936700
今日推荐