多线程

一 什么是多线程

1. 什么是进程

进程:
系统中运行的独立的一个应用程序; 每个进程均运行在专门受保护的内存空间中: 比如MAC中同时开着Xcode和QQ, 就是两个进程。

2. 什么是线程

线程:
一个进程要想执行任务, 必须的有线程(每一个进程至少有一个线程),
线程是进程的基本执行单元, 一个进程中所有的任务都是在线程中执行的. 比如说任务的下载, 音乐播放等.

3. 线程的串行

一个线程中的任务是串行的, 如果要在一个线程中执行多个任务, 任务就必须一个一个按照顺序执行.

4. 多线程

一个进程中可以开启多个线程, 每条线程可以同时并行执行不同的任务, 多线程可以提高程序的执行效率.
比如: 3个文件下载任务,
在一个线程中, 只能一个任务下载完成以后再下载下一个,
多线程就可以开3个线程, 可以同时下载3个任务.

5. 多线程的优缺点

优点:
能适当提高程序的执行效率
能够适当提高资源的利用率(CPU, 内存利用率);
缺点:
开启线程需要占用一定的内存空间, 如果开启大量的线程,会占用大量的内存空间,降低程序的性能
线程越多, CPU在调度线程上的开销就越大.

多线程在iOS中的应用

主线程:一个iOS程序运行后, 会默认开启一条线程, 成为主线程或者为UI线程, 其作用就是显示或者刷新UI界面, 处理UI事件.
主线程使用注意: 别将耗时操作放在主线程, 否则会造成卡顿.

以上基础知识均来自文顶顶博客, 感谢大神分享

二 在iOS中有多线程的实现方案:

1 Pthread: 需要程序员管理, 现在几乎不用.

  • 是一套通用的多线程API
  • 适用于Unix/Linux/Windows等系统
  • 跨平台/可移植
  • C 语言, 难度大
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    [self pthreadDemo];
}
-(void)pthreadDemo
{
    /*
     pthread 属于POSIX 多线程开发框架
     参数
      1:指向线程的指针
      2:线程属性
      3:指向函数的指针
      4:传递给函数的参数
     */
    NSString *str = @"LFFW";
    pthread_t threadID;
    int result = pthread_create(&threadID, NULL, &demo, (__bridge void *)(str));
    
    if(result == noErr)
    {
        NSLog(@"OK");//1
    }else
    {
        NSLog(@"error:%d",result);
    }
}

void * demo(void  *param)
{
    NSLog(@"%@,%@",[NSThread currentThread],param);
    return  NULL;
}

2 NSThread: OC语言, 程序员管理线程

  • OC语言, 更加面向对象使用
  • 简单易用, 可以直接操作线程对象
//取消线程
- (void)cancel;

//启动线程
- (void)start;     //常用

//判断某个线程的状态的属性
@property (readonly, getter=isExecuting) BOOL executing;
@property (readonly, getter=isFinished) BOOL finished;
@property (readonly, getter=isCancelled) BOOL cancelled;

//设置和获取线程名字
-(void)setName:(NSString *)n;
-(NSString *)name;

//获取当前线程信息
+ (NSThread *)currentThread;    // 常用

//获取主线程
+ (NSThread *)mainThread;

//从现在起睡多少秒
+ (void)sleepForTimeInterval:(NSTimeInterval)time;

//从现在起睡到指定的日期
+ (void)sleepUntilDate:(NSDate *)date;

//一旦强行终止线程,后续的所有代码都不会被执行
//注意:在终止线程之前,应该注意释放之前分配的对象
[NSThread exit];    //主线程使用, 会死;

2.1 资源共享-互斥锁

  1. 保证了锁内的代码, 在同一时间, 只有一个线程执行任务
  2. 互斥锁的锁定范围越小越好, 范围越大, 效率越差
    参数:
    1. 能够加锁的任意NSObject对象
    2. 注意: 锁的对象一定要能够保证所有线程访问
    3. 如果代码中只有一个地方需要加锁,大多都使用 self,这样可以避免单独再创建一个锁对象

2.2 资源共享-原子属性

  1. 原子属性:
    如果不写atomic,多线程写入属性时,保证同一时间只有一个线程能够写入操作;
    单(线程)写,多(线程)读技术。

  2. 线程安全:多个线程操作数据,仍然能保证数据正确

  3. 实际上,原子属性内部会有一把锁;自旋锁

共同点:
同一时间,只有一个线程访问;
不同点:
互斥锁:如果发现其他线程正在执行锁定的代码,线程就会进入休眠状态,等待线程完成,就唤醒
自旋锁:如果发现其他线程正在执行锁定的代码,线程就会死循环模式,等待线程完成,就执行锁定代码;

2 GCD: OC语言, 自动管理线程, 经常使用

  • 为了替代NSThread等线程技术
  • 充分利用了多核技术

3 NSOperation: OC语言, 自动管理, 经常使用

  • 底层是GCD
  • 比GCD多了一些简单实用的功能
  • 使用更加面向对象

下面会重点详细写GCD 和NSOperation的用法

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

推荐阅读更多精彩内容

  • Object C中创建线程的方法是什么?如果在主线程中执行代码,方法是什么?如果想延时执行代码、方法又是什么? 1...
    AlanGe阅读 5,773评论 0 17
  • 一: 多线程的基本概念1.同步与异步的概念1.1 同步 必须等待当前语句执行完毕,才可以执行下一个语句。1.2...
    程序_猿阅读 8,867评论 1 16
  • 进程 1:进程是指在系统中正在运行的一个应用程序,进程是程序在计算机上的一次执行活动。 2:每个进程之间是相互独立...
    没有梦想_何必远方阅读 4,320评论 0 3
  • 多线程 在iOS开发中为提高程序的运行效率会将比较耗时的操作放在子线程中执行,iOS系统进程默认启动一个主线程,用...
    郭豪豪阅读 7,389评论 0 4
  • 感恩早上跟妈妈出去,买了两个粽子。我留了一个给哥哥,而不是一个人吃完。我越来越会照顾家人。祝福我更懂事,祝福我的家...
    Daisy明阅读 1,241评论 1 0