iOS 多线程问题
哈,终于有时间来整理一下这个多线程问题了,好了费话不多说,进入正题。
#我的拙见
进程
进程(progress)就是一个已运行程序的实体,也是多个线程的一个容器。程序本身只是指令得集合,而进程才是程序(那些指令)的真正运行。每个进程都是独立的,都会在其专有的且受保护得内存空间中。
现今分时系统得基本运行单位。
线程
线程(thread)它被包含在进程之中,一条线程就是进程中一个单一顺序的控制流,一个进程中并发多个线程,每条线程并行执行不同的任务
线程是进程得基本执行单元,一个进程得所有任务都在线程中执行。
线程串行
1个线程中任务的执行是串行的
如果在一个线程中执行多个任务,那么只能一个一个地顺序执行这些任务
同一时间一个线程只能执行一个任务
并发
一个cpu强行要处理多个线程,在宏观上造成一种假象,假装一起执行,其实是交替执行吧
并行
多个核一起走,真正的一起来处理
异步
异步是最终目的,多线程只是实现异步的一种手段。等待某事件的过程中继续做自己的事,不需要等待这一事件完成后再工作。和同步相对。
好吧以上就是我理解的,还有些不足,还请吊大的指出来
#iOS的多线程应用有四种代码写的方式。
- Pthread
- NSThread
- GCD
- NSOperation & 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
本文来自博客园,作者:赫凯,转载请注明原文链接:https://www.cnblogs.com/heKaiii/p/15491314.html

浙公网安备 33010602011771号