Multithread Basic
Multithread Basic
技术分享|2015-8-4|Last edited: 2024-3-22
type
status
date
slug
summary
tags
category
icon
password
###一.基本概念
 
进程和线程的区别 进程和线程的主要差别在于它们是不同的操作系统资源管理方式,进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
 
In our app, we always want to concurrency control multiple tasks. not only for finish more tasks as soon as possible, but enhance efficiency of system resource usage, and then enhance whole system efficiency.
Thread :
A smallest sequence of programmed instructions that can be managed independently by a scheduler ( appropriately supported by the operating system ) A thread is an execution context, which is the information of a stream of instructions that a CPU needs to execute.
Queue
The scheduler for the thread.
Process :
A program in execution is called process. A process can have multiple threads running. Depending on the operating system (OS), a process may be made up of multiple threads of execution that execute instructions concurrently. One operation of manipulate data structure, let system allocate and move resource.
Task :
Program contains tasks. A task is something you want to be done. Also a set of program instructions , which are operations we gonna execute in the thread.
Thread life cycle create -> ready(detachNewThreadSelector,detachNewThreadWithBlock,performSelectorInBackground) instance an object put in thread -> isExecuting -> isCanceled -> isFinished.
Concurrency: means running multiple thread at same time. In IOS to performe Concurrency operations we can use GCD(dispatch_queue), NSOpreation, NSThread(pthread),MachTread(cannot directly handle it).
 
 
###二.iOS多线程对比
#####1. NSThread
每个NSThread对象对应一个线程,真正最原始的线程。
1)优点:NSThread 轻量级最低,相对简单。
2)缺点:手动管理所有的线程活动,如生命周期、线程同步、睡眠等。 #####2. NSOperation
自带线程管理的抽象类。
1)优点:自带线程周期管理,操作上可更注重自己逻辑。
2)缺点:面向对象的抽象类,只能实现它或者使用它定义好的两个子类:NSInvocationOperation 和 NSBlockOperation。 #####3. GCD Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法。
1)优点:最高效,避开并发陷阱。
2)缺点:基于C实现。 #####5. 选择小结
1)简单而安全的选择NSOperation实现多线程即可。
2)处理大量并发数据,又追求性能效率的选择GCD。
3)NSThread本人选择基本上是在做些小测试上使用,当然也可以基于此造个轮子。
###三.场景选择
  1. 图片异步加载。这种常见的场景是最常见也是必不可少的。异步加载图片有分成两种来说明一下。 第一种,在UI主线程开启新线程按顺序加载图片,加载完成刷新UI。 第二种,依然是在主线程开启新线程,顺序不定地加载图片,加载完成个字刷新UI。
  1. 创作工具上的异步。 这个跟上边任务调度道理,只是为了丰富描述,有助于“举一反三”效果。如下描述的是app创作小说。 场景一,app本地创作10个章节内容未成同步服务器,同时发表这10个章节产生的一系列动作,其中上传内容,获取分配章节Id,如何后台没有做处理最好方式做异步按顺序执行。 场景二,app本地创作列表中有3本小说为发表,同时发表创作列表中的3本小说,自然考虑并行队列执行发表。
###四.使用方法
第三标题场景选择内容实现先留下一个悬念。具体实现还是先熟知一下各自的API先。 #####1. NSThread
1.1)三种实现开启线程方式:
①.动态实例化
②.静态实例化
③.隐式实例化
有了以上的知识点,可以试探了一下编写场景选择中的“图片加载”的基本功能了。
1.2)使用这三种方式编写代码
1.3)看先效果图
notion image
1.4)NSThread的拓展认识
①获取当前线程
②获取主线程
③暂停当前线程
④线程之间通信
显然动态创建线程多了几行代码,其实就是那几行代码,如果重复编写数遍那是一件多么不爽的事情。首次看来静态方法创作线程和隐式创建线程显得比较方便,简洁。从知识结构来说,讲到这里应该讲述一下线程锁,鉴于并不常用和文章过长就不在此详细讲述,有兴趣可以自行查阅。 #####2. NSOperation
主要的实现方式:结合NSOperation和NSOperationQueue实现多线程编程。
  • 实例化NSOperation的子类,绑定执行的操作。
  • 创建NSOperationQueue队列,将NSOperation实例添加进来。
  • 系统会自动将NSOperationQueue队列中检测取出和执行NSOperation的操作。
2.1)使用NSOperation的子类实现创作线程。
①.NSInvocationOperation创建线程。
②.NSBlockOperation创建线程
③.自定义NSOperation子类实现main方法
实现main方法
  • 创建线程实例并添加到队列中
    • LoadImageOperation *imageOperation = [LoadImageOperation new]; imageOperation.loadDelegate = self; imageOperation.imgUrl = imgUrl;
      NSOperationQueue *queue = [[NSOperationQueue alloc]init]; [queue addOperation:imageOperation];
2.2)使用这三种方式编写代码
创建各个实例并添加到队列表当中
附自定义NSOperation子类main主要代码实现
2.3)看先效果图
notion image
#####3. GCD多线程 GCD是Apple开发,据说高性能的多线程解决方案。既然这样,就细说一下这个解决方案。
进过Nsthread和NSOperation的讲述和上边的基础概念,可以开始组合用起来吧。并发队列串行队列都用起来。
3.1)分发队列种类(dispatch queue)
①.UI主线程队列 main queue
②.并行队列global dispatch queue
这里的两个参数得说明一下:第一个参数用于指定优先级,分别使用DISPATCH_QUEUE_PRIORITY_HIGH和DISPATCH_QUEUE_PRIORITY_LOW两个常量来获取高和低优先级的两个queue;第二个参数目前未使用到,默认0即可
③.串行队列serial queues
3.2)6中多线程实现 ①后台执行线程创建
②UI线程执行(只是为了测试,长时间加载内容不放在主线程)
③一次性执行(常用来写单例)
④并发地执行循环迭代
⑤延迟执行
⑥自定义dispatch_queue_t
3.3)对比多任务执行 异步加载图片是大部分app都要问题,那么加载图片是按循序加载完之后才刷新UI呢?还是不安顺序加载UI呢?显然大部分的希望各自加载各自的图片,各自刷新。以下就是模拟这两种场景。
①先后执行,加载两张图片为例
②并行队列执行,也是以加载两张图片为例
①中等到两张图片加载完成后一起刷新,②就是典型的异步并行的例子,不需要理会各自图片加载的先后问题,完成加载图片刷新UI即可。从加载图片中来说,第①种不太合适使用,但是对于在上边场景选择的时候的创作工具来说有很大的好处,首先得异步进行,然后异步中有得按顺序执行几个任务,比如上传章节内容。因此,我们可以灵活考虑使用这两多线程任务执行方式,实现各种场景。
3.4)编码实现
以上3.3的内容99%代码一样,就不提供一个稍微整体的代码了。看看下边的效果图吧。
3.5)效果图如下
notion image
 
从Idea到APP IOS RunTime