对于多线程的一些理解

1.PThread : 是一个C语言的一个API接口,由于使用难度较大,较为底层。我们在平常开发的时候不经常使用!
2.NSThread: 是三种方法里面相对轻量级的,但需要管理线程的生命周期、同步、加锁问题,这会导致一定的性能开销
3.NSOperation: 是基于OC实现的,NSOperation以面向对象的方式封装了需要执行的操作,不必关心线程管理、同步等问题。NSOperation是一个抽象基类,iOS提供了两种默认实现:NSInvocationOperation和NSBlockOperation,当然也可以自定义NSOperation
4.GCD:提供了一些新特性、运行库来支持多核并行编程,它的关注点更高:如何在多个cpu上提升效率

下面主要介绍一些NSThread:

首先NSThread初始化方法:(动态方法)
``
1 - (id)initWithTarget:(id)target selector:(SEL)selector object:(id)argument;

``
参数解析:
selector :线程执行的方法,这个selector最多只能接收一个参数

target :selector消息发送的对象

argument : 传给selector的唯一参数,也可以是nil
2初始化方法(静态方法)
2 + (void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(id)argument;
3 [NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil]; // 调用完毕后,会马上创建并开启新线程

  1. 隐式创建线程的方法
    ``
    4 [self performSelectorInBackground:@selector(run) withObject:nil];

``

获取当前线程
5 NSThread *current = [NSThread currentThread];

获取主线程
6 NSThread *main = [NSThread mainThread];

暂停线程
// 暂停2s [NSThread sleepForTimeInterval:2]; // 或者 NSDate *date = [NSDate dateWithTimeInterval:2 sinceDate:[NSDate date]]; [NSThread sleepUntilDate:date];

线程间的通信

  1. 在指定线程上执行操作
    [self performSelector:@selector(run) onThread:thread withObject:nil waitUntilDone:YES];
  2. 在主线程上进行操作
    [self performSelectorOnMainThread:@selector(run) withObject:nil waitUntilDone:YES];
  3. 在当前线程执行操作
    7 [self performSelector:@selector(run) withObject:nil];

优缺点
1.优点:NSThread比其他两种多线程方案较轻量级,更直观地控制线程对象
2.缺点:需要自己管理线程的生命周期,线程同步。线程同步对数据的加锁会有一定的系统开销

补充一点就是:NSThread有哪几种状态,和转换的逻辑

新建->就绪-> cup调度当前任务->运行->阻塞->死亡->CUP调度其他任务->就绪
主线程的一些概念:
默认启动的线程,也叫作UI线程,用来显示和刷新UI界面,和处理一些UI事件的。 需要注意的是:不要把耗时操作放到主线程上去做!UI操作必须在主线程中执行 !!!!

说一说如何解决多条线程访问同一块资源造成的线程安全的问题,以及一些注意点!

加同步(互斥)锁 @synchronized OC中的同步锁:(锁对象) + {要锁住的代码} 锁对象:要求是全局唯一的属性 注意点: 要注意加锁的位置 加锁需要耗费性能,因此需要注意加锁的条件(多线程访问同一块资源) 专业术语:线程同步

原子和非原子属性的区别

atomic:原子属性,会为setter方法默认加锁,线程是安全的,但是会消耗大量资源! noatomic:非原子属性,不会为setter方法加锁。非线程安全,适合内存小的移动设备。

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

推荐阅读更多精彩内容

  • 一、多线程基础 基本概念 进程进程是指在系统中正在运行的一个应用程序每个进程之间是独立的,每个进程均运行在其专用且...
    AlanGe阅读 557评论 0 0
  • 原文地址 http://www.cnblogs.com/kenshincui/p/3983982.html 大家都...
    怎样m阅读 1,296评论 0 1
  • 不知怎么就中了甄嬛传的毒, 虽然每一年各个电视台都会争先恐后的重播, 每次摇控器一选到正在播的那个台, 也不管是正...
    菲荷阅读 433评论 0 2
  • 台历上的日期,过一天,画一个圆圈。如果碰到某天心情特别不好,或是遇上一个倒胃口的旷世奇葩,那么那一天就画一个叉。画...
    不爱跑步的胖橘阅读 397评论 0 1
  • 颖打来电话,问我什么时候回老家? 我回:“已经回去过了,刚回合肥没几天。” 她破口大骂:“葛芳,你太过分了吧!我和...
    葛芳阅读 243评论 10 8