首页 > 系统 > iOS > 正文

iOS 多线程问题

2019-11-07 23:56:19
字体:
来源:转载
供稿:网友

哈,终于有时间来整理一下这个多线程问题了,好了费话不多说,进入正题。

我的拙见进程线程线程串行并发并行异步iOS的多线程应用有四种代码写的方式Pthread 这个方式我就没用过好吧NSthread 这才是苹果封装的这个我也很少用GCD这个好用我自己常用- 创建队列- 创建任务- 队列组

我的拙见

进程

进程(PRogress)就是一个已运行程序的实体,也是多个线程的一个容器。程序本身只是指令得集合,而进程才是程序(那些指令)的真正运行。每个进程都是独立的,都会在其专有的且受保护得内存空间中。

现今分时系统得基本运行单位。

线程

线程(thread)它被包含在进程之中,一条线程就是进程中一个单一顺序的控制流,一个进程中并发多个线程,每条线程并行执行不同的任务 线程是进程得基本执行单元,一个进程得所有任务都在线程中执行。

线程串行

1个线程中任务的执行是串行的 如果在一个线程中执行多个任务,那么只能一个一个地顺序执行这些任务 同一时间一个线程只能执行一个任务

并发

一个cpu强行要处理多个线程,在宏观上造成一种假象,假装一起执行,其实是交替执行吧

并行

多个核一起走,真正的一起来处理

异步

异步是最终目的,多线程只是实现异步的一种手段。等待某事件的过程中继续做自己的事,不需要等待这一事件完成后再工作。和同步相对。

好吧以上就是我理解的,还有些不足,还请吊大的指出来

iOS的多线程应用有四种代码写的方式。

PthreadNSThreadGCDNSOperation & NSOperationQueue

Pthread 这个方式,我就没用过好吧。

就是一套多系统通用的多线程API,移植性很强。在iOS可以用但是是基于c语言的,这酸爽。

NSthread 这才是苹果封装的(这个我也很少用)

可以完全面向对象,所有我们直接操控线程对象。

GCD这个好用(我自己常用)

这个就是直观,而且好用,代码简洁。是苹果为多核的并行运算提出的解决方案,所以会自动合理地利用更多的CPU内核,它会自动管理线程的生命周期,我们只需要告诉干什么就行了,也是用c语言,结合了block(swift李叫做闭包),大家都喜欢用这个呢 具体介绍的话看这个 http://www.jianshu.com/p/d56064507fb8

- 创建队列

主队列 是特殊的串行队列,常用来刷新UI,UI刷新变化的工作经常在主队列里进行,像网络请求里面,block返回的进度条,在界面操作的时候就必须在主队列里进行。 let queue = ispatch_get_main_queue() //swift自己创建的队列 自己可以创建并行和串行队列,会有两个参数,第一个是标识符,用于DEBUG的时候标志唯一的队列,可为空。第二个比较重要,╭(╯^╰)╮第二个来表示创建的队列是串行还是并行的。传入DISPATHCH_QUEUE_SERIAL 或者 NULL表示创建的是串行的队列。传入DISPATCH_QUEUE_CONCURRENT来表示创建并行队列。//swift 串行let queue = dispatch_queue_create("标识",nil);let queue = dispatch_queue_create("标识",DISPATHCH_QUEUE_SERIAL );//swift 并行let queue = dispatch_queue_create("标识",DISPATCH_QUEUE_CONCURRENT);全局并行队列 只要是并行的任务都会加入到这个队列。系统提供的并发队列let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0)

好的创建完队列之后,就创建任务吧

- 创建任务

同步任务 会阻塞当前的线程(SYNC)dispatch_sync(<#queue#>,{()->Void in //code here 3.0之前代码 println(NSThread.currentThread())})异步任务 不会阻塞当前线程(ASYNC)dispatch_async(<#queue#>,{()>Void in //code here 3.0之前代码 println(NSThread.currentThread())})

现在的3.0将代码的语法风格都进行了较大的改革,和之前的不太一样,我先把理论弄下来,然后再实现吧 详细戳这 http://www.jianshu.com/p/8442576377a8 这里详细的解释了异步,同步,串行,并行都是在Swift 3.0下实现的

- 队列组

队列组使我们能够然所有的任务都执行完之后,再来执行语句。

let group = dispatch_group_create()let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0)dispatch_group_async(group,queue){()-> Void in for _ in 0..<3{ println(NSThread.currentThread()) }}dispatch_group_async(group,disptach_get_main_queue()){()-> Void in for _ in 0..<8{ println(NSThread.currentThread()) }}dispatch_group_async(group,queue){()-> Void in for _ in 0..<5{ println(NSThread.currentThread()) }}//总得 (3.0之前的代码,预计不能运行了吧)dispatch_group_notify(group,dispatch_get_main_queue()){()->Void in println("完成/(NSThread.currentThread())")}

主要是这个大神写的http://www.jianshu.com/p/0b0d9b1f1f19


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表