iOS 多线程

NSThread

  • 使用NSThread对象建立一个线程非常方便,但要使用NSThread管理多个线程较困难,不推荐使用;
  • [NSThread currentThread]跟踪任务所在线程,适用于这三种技术。
- (void) testNSThread{
    // 创建方法1
    [NSThread detachNewThreadSelector:@selector(actionForNSThread:) toTarget:self withObject:@"1"];

    // 创建方法2
    NSThread *thread = [[NSThread alloc]initWithTarget:self selector:@selector(actionForNSThread:) object:@"1"];
    [thread start];
}

- (void) actionForNSThread:(NSString *)extraData{
    @autoreleasepool{
        NSLog(@"actionForNSThread===%@", extraData);
    }
}

NSObject

NSObject的多线程方法:
  • 开启后台执行任务的方法:
- (void)performSelectorInBackground:(SEL)@Selector withObject:(id)arg
  • 在后台线程中通知主线程执行任务的方法:
- (void)performSelectorOnMainThread:(SEL)@Selector withObject:(id)arg waitUntilDone:(BOOL)wait
NSObject的多线程方法注意事项:
  • NSObject的多线程方法使用的是NSThread的多线程技术.
  • NSThread的多线程技术不会自动使用@autoreleasepool.
    在使用NSObject或NSThread的多线程技术时,如果涉及到对象分配,需要手动添加@autoreleasepool.

NSOperationQueue

  • 支持线程池,可配置并发线程最大数量;
  • 可设置线程间依赖关系,即在特定线程执行完毕后执行该线程;
- (void) testNSOperationQueue{
    // queue
    NSOperationQueue *myQueue = [[NSOperationQueue alloc] init];
    [myQueue setMaxConcurrentOperationCount:1];//设置并发线程数量.
    
    // function operation
    NSInvocationOperation *op = [[NSInvocationOperation alloc]
                                 initWithTarget:self selector:@selector(operationAction:) object:@(1)];
    // block operation
    NSBlockOperation *opBlock = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"NSBlockOperation----%@----obj",[NSThread currentThread]);
    }];
    
    [op addDependency:opBlock];//设置依赖关系(先后执行顺序).
    
    [myQueue addOperation:op];
    [myQueue addOperation:opBlock];
}

-(void)operationAction:(id)obj{
    NSLog(@"NSInvocationOperation----%@----obj : %@ ",[NSThread currentThread], obj);
};

线程同步

NSLock

NSLock *lock = [[NSLock alloc]init];
[lock lock];// 加锁
[lock unlock];// 解锁

@synchronized

同步代码块,将原子操作的代码放在synchronized中间。

@synchronized(self){     
}

NSCondition

条件锁,除支持lock和unlock外,还支持暂停或恢复线程。

NSCondition *con = [[NSCondition alloc]init];
[con lock];// 加锁
[con unlock];// 解锁
[con wait]; // 暂停当前线程
[con signal]; // 恢复当前线程

NSRecursiveLock:

递归锁,针对递归

NSDistributedLock:

分布锁,它本身是一个互斥锁,基于文件方式实现锁机制,可以跨进程访问。

pthread_mutex_t:

同步锁,基于C语言的同步锁机制,使用方法与其他同步锁机制类似。

本文作者:gcoder.io
本文链接:http://gcoder-io.github.io/2015/06/12/ios-base-thread/
版权声明: 本博客所有文章均为原创,转载请注明作者及出处

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 多线程基本概念 单核CPU,同一时间cpu只能处理1个线程,只有1个线程在执行 。多线程同时执行:是CPU快速的在...
    WeiHing阅读 726评论 1 5
  • 多线程 在iOS开发中为提高程序的运行效率会将比较耗时的操作放在子线程中执行,iOS系统进程默认启动一个主线程,用...
    郭豪豪阅读 2,618评论 0 4
  • 1、简介:1.1 iOS有三种多线程编程的技术,分别是:1.、NSThread2、Cocoa NSOperatio...
    LuckTime阅读 1,377评论 0 1
  • 概览 大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算。可是无论是哪种语言开发的程序最...
    CocoLeo阅读 870评论 1 9
  • 梦想是一个被人嘲笑的代名词,也是一个极度昂贵的奢侈品。 当我写下这些清单时,我被自己的大胆,无谓所吓倒。 2017...
    b83c46eba77f阅读 301评论 0 0