多线程

一 什么是多线程

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的用法

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容

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