多线程和队列

作者: 未来可期me | 来源:发表于2017-03-27 18:45 被阅读175次

这篇,就讲点这个吧
1.进程
2.线程
3.iOS中3种多线程的比较
4.APP的内存分区及在运行时的内存分配

  • 听着《阴天》,写着总结,感觉有点气氛不对。

1.基本概念


进程:
进程是指在系统中正在运行的一个应用程序,负责程序运行的内存分配,进程之间是相互独立的

线程:
线程是进程的基本执行单元,一个进程的所有任务都在线程中执行,一个进程中至少包含一条线
程即主线程

队列:
在iOS开发中,队列和线程是两个相互穿插的概念,所有的线程是应该有个线程队列的,线程的
创建和回收不需要程序员操作,有队列负责。


2.iOS中3种多线程技术

NSThread----- GCD(Grand Center Dispatch) ----- NSOperation


1.NSThread
优点:量级比较轻 使用简单
缺点:不能控制线程的执行顺序,自己管理线程的生命周期,线程的同步,加锁,睡眠等。

2.GCD
优点:线程的生命周期由系统和自己分配,采用block代码块使程序更加便于阅读和修改
缺点:除全局队列以外任何由GCD创建的队列无法设置优先级

3.NSOperation
优点:iOS4在GCD推出以后对GCD的封装,更加方便的管理并发和线程之间的优先级
缺点:更加高级抽象


GCD与NSOperation的区别


GCD是将任务添加到队列中(并行/串行),并且制定任务执行的函数(同步/异步),GCD中只有全局队列有4中优先级,要想为自己创建的队列添加优先级只有通过将我们手动创建的队列作为全局队列的子队列才可以设置优先级
如何设置子队列:dispatch_set_target_queue,通过他可以设置调整目标队列,比如可以设置目标队列为全局队列那么这个全局队列可以设置优先级


无标题.png

GCD的高级功能有一次执行dispatch_once、延迟执行 dispatch_after、调度组


GCD中队列的选择:
日常开发中建议选择全局队列
1.全局队列是一个并行队列
2.系统框架中已经创建好了,直接拿过来用就行了

既然系统已经写好了一个并行队列了是不是在以后的开发中需要用到的并行队列的时候都用全局队列
在出错的情况下全局队列无法定位到具体的任务,所以在这种情况下要用到自己定义并发队列,容易找出哪个队列发生了错误

NSOperation把操作添加到队列中,是对GCD的封装,可以随时取消已经设定准备好要执行的任务,可以设置队列中每一个操作的优先级,也可以设置最大操作的并发数(setMaxConcurrentOperationCount:)可以设置队列的依赖关系(addDependency)

3.队列


队列又可以分为:
串行队列 dispatch_queue_creat(… , …)
并行队列

全局队列 dispatch_get_global_queue
主队列 dispatch_get_main_queue

感觉没和多线程挂上钩呀
那么队列是用来干什么的?
队列是用来调度任务的
任务是指什么呢?
任务就是添加在队列中的线程


任务的调度


任务:
1.同步
一个一个的执行 单线程
2.异步
不用等当前代码执行完就可以执行下一条 多线程的代名词

任务的调度:
串行队列-同步任务
串行队列-异步任务
并行队列-同步任务
并行队列-异步任务


1.串行队列-同步任务 不开线程
不开线程,在当前的线程执行,当前代码不执行完不会执行后面的代码
2.串行队列-异步任务 开线程
开一条线程
3.并行队列-同步任务 不开线程
不会创建新的线程,所有任务会在同一线程中执行
4.并行队列-异步任务 开线程
会创建多个线程

结论:
开不开线程和执行任务的函数有关
同步 – 不开
异步 – 开
开几条线程和执行任务的队列有关
串行队列 开一条
并行队列 开n条

无标题.png

输出结果是---1111 33333 22222

无标题.png

输出结果是-- 死锁了

死锁
主队列和主线程的关系:
主队列里必须有一个主线程,主队列里还可以再加线程

主队列的特点:主线程有任务就暂时不调度任务—相互等待等死了

这句代码将这个同步任务加入主线程队列里,等待主线程完成才返回block里面的内容,但是当程序运行到这行代码,由于主线程没有完成,block不会有返回,并且也不会跳过这行代码所以就造成了死锁现象。

友情链接初光夫

相关文章

  • 队列和线程

    [iOS多线程中,队列和执行的排列组合结果分析] 多线程中的队列有:串行队列,并发队列,全局队列,主队列。 执行的...

  • 为什么发送邮件要使用消息队列而不是多线程

    什么情况下的异步操作使用消息队列而不是多线程?消息队列和多线程两者并不冲突,多线程可以作为队列的生产者和消费者。使...

  • iOS多线程之GCD

    相关文章:iOS多线程之NSThreadiOS多线程之NSOperations 队列 队列和线程是两个不同的概念。...

  • RocketMQ消息队列还没入门就想放弃

    题外话 什么情况下的异步操作需要使用消息队列而不是多线程? 消息队列和多线程两者并不冲突,多线程可以作为队列的生产...

  • 队列

    多线程队列 多进程队列

  • 多线程02

    多线程2 GCD队列组: 基本使用: 常用函数 队列和组队列的区别 队列:封装任务,添加任务到队列 组队列:封装任...

  • Thread

    队列 线程锁 多线程,线程池 队列 多线程爬虫示例 多线程 自定义线程 线程池

  • iOS开发-队列和同步异步执行的结果分析

    多线程中的队列有:串行队列,并发队列,全局队列(并发),主队列(串行)。 执行的方法有:同步执行和异步执行。 提到...

  • iOS - Multi-Thread

    概念篇 进程 线程 多线程 单核多线程 & 多核多线程 并行 & 并发 同步 & 异步 队列 队列 & 任务 的执...

  • iOS多线程--GCD

    队列:串行队列,并发队列,全局队列,主队列。 2.执行的方法有:同步执行和异步执行。 多线程,四种,pthread...

网友评论

本文标题:多线程和队列

本文链接:https://www.haomeiwen.com/subject/cigrottx.html