多线程总结

关于多线程

(一).多线程
主线程:显示/刷新UI界面,处理UI事件
子线程:处理耗时操作 例如网络访问
[图片上传失败...(image-d0f9b0-1526873962369)]
1.NSThread创建方式
(1).alloc/init-start

NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(longOperationa :) object:@"THREADkn"]; 
[thread start]; //会开启子线程执行longOperationa : 方法 

(2).detachNewThreadSelector

[NSThread detachNewThreadSelector:@selector(longOperation:) toTarget:self withObject:@"DETACH"]; 

detachNewThreadSelector 类方法不需要启动,会自动创建子线程并执行 @selector 方法。

(3).

[self performSelectorInBackground:@selector(longOperation:) withObject:@"PERFORM"];

performSelectorInBackground 是 NSObject 的分类方法。
会自动在后台线程执行 @selector 方法。
没有 thread 字眼,隐式创建并启动线程。
所有 NSObject 都可以使用此方法,在其他线程执行方法
2.线程状态
(1).创建
(2).就绪 向线程对象发送start消息,线程对象被加入可调度线程池等待CPU调度 其他两个方法就会直接实例化一个线程对象加入可调度线程池
(3).运行 CPU负责调度可调度池中线程的执行 线程执行完毕前 状态就会在就绪和运行之间来回切换 程序员无法干预
(4).阻塞 休眠或阻塞线程执行 sleepForTimeInterval:休眠到指定时长 sleepUntilDate:休眠到指定日期 @synchronized 互斥锁
(5).死亡 正常死亡 就是线程执行完毕 如果是非正常死亡 exit/return 在终止线程之前,应该注意释放之前分配的对象!

3.线程属性
(1).线程的名字name -作用就是在大型的商业项目中,通常需要在程序崩溃的时候,获取程序准确执行的所在线程
(2).线程优先级-threadPriority 0~1.0线程优先级 默认是0.5 优先级高只是保证CPU调度的可能性会高 不是一定 开发中不要修改,调度频率快慢由CPU决定
(3).栈区大小-stackSize 默认情况下,无论主线程还子线程,栈区的大小都512K 可以修改

4.资源共享
多个线程同时调用同一个线程方法,共享同一个资源,就要用互斥锁 @synchronized(self) {} 保证同一时间内只有一条线程能执行,互斥锁效率就越差。
原子属性:多个线程在写入原子属性时调用setter方法保证只有一个线程在写入内部实现是通过自旋锁效率比互斥锁高。
互斥锁:如果发现有其他线程正在执行锁定的代码,线程会进入休眠状态,等待其他线程执行完毕,打开锁之后,线程会被唤醒。
自旋锁:如果发现有其他线程正在执行锁定的代码,线程会以死循环的方式,一直等待锁定代码执行完成。

5.线程间通讯
(1).在后台子线程线程下载图像

[self performSelectorInBackground:@selector(downloadImage) withObject:nil]; 

(2).主线程更新UI

 [self performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:NO]

6.GCD
(1).同步/异步
决定是否等待当前执行才执行下一步 同步不会开启线程 异步开启线程
(2)Block
全局Block:block中没有任何外部变量
栈区Block:block中使用了外部变量
mrc情况下外部变量在栈区中由程序员管理.
arc情况下会复制到堆中, 如果想修改block中变量 必须外部用__block修饰变量
block 用copy修饰
(3)队列
串行队列:先进先出,按顺序执行,无论异步还是同步需要执行完一个任务才能执行下一个任务
全局队列/并发队列:先进先出, 如果是同步执行,就是按顺序执行 如果是异步执行 就会同时执行多个任务.
主队列:不会开启线程 都是在主线程中执行 主线程空闲的时候会调用 同步执行就会死锁
同步任务作用:任务依赖/Barrier 例如登陆时同步任务 等登陆完毕后才能执行后面任务
(4)单例

+ (instancetype)sharedSingleton {
    static id instance;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        instance = [[self alloc] init];
    });
    return instance;
} 

(5).延时

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), task); 

(6)调度组
原理:就是一组任务都做调度组中. 监听一组任务完成,才通知其他操作
应用场景:缓存网络图片
实现步骤:
1).创建调度组 2).创建全局队列 3).将任务添加到队列和调度组中 4).监听任务完成

7.NSOperation
原理:基于GCD,默认异步执行,就是将操作(NSBlockOperation)添加队列中.
比GCD多的功能:
(1).设置最大并发数
最大并发数:self.queue.maxConcurrentOperationCount = 2
队列中的操作数 self.queue.operationCount
(2).暂停
暂停 self.queue.isSuspended挂起
(3).取消
取消所有操作 self.queue cancelAllOperations

多线程的好处跟坏处

1、好处:

1、使用线程可以把程序中占据时间长的任务放到后台去处理,如图片、视频的下载

2、发挥多核处理器的优势,并发执行让系统运行的更快、更流畅,用户体验更好

缺点:

1、大量的线程降低代码的可读性,

2、更多的线程需要更多的内存空间

3、当多个线程对同一个资源出现争夺的时候要注意线程安全的问题。

iOS有三种多线程编程的技术:

1、NSThread(两种创建方式)

[NSThread detachNewThreadSelector:@selector(doSomething:) toTarget:self withObject:nil];

NSThread *myThread = [[NSThread alloc] initWithTarget:self selector:@selector(doSomething:) object:nil];

[myThread start];

2、NSOperationQueue

NSOperationQueue*oprationQueue= [[NSOperationQueuealloc] init];

oprationQueueaddOperationWithBlock:^{

//这个block语句块在子线程中执行

}

3、Grand Central Dispatch (GCD)

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

//耗时的操作

dispatch_async(dispatch_get_main_queue(), ^{

//更新界面

});

});

PS:不显示的创建线程的方法:

用NSObject的类方法performSelectorInBackground:withObject:创建一个线程:[Obj performSelectorInBackground:@selector(doSomething) withObject:nil];

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

推荐阅读更多精彩内容