线程?进程?
关于进程和线程的关系和区别网上可以找到很多很好的详解和比喻,在此简单说下二者的含义(在下的拙见)
基础概念
- 线程是程序执行流的最小单元,也是指进程内的可执行单元,可调度的实体。
从某中意义上来说,进程就是一个应用程序在处理机上的一次执行过程,它是一个动态的概念,而线程是进程中的一部分,进程包含一个或多个线程在运行。
- 一个线程只能属于一个进程,而一个进程至少有一个线程;
- 处理机会给线程,即真正在处理上运行的是线程;
- 资源分配给进程,同一进程下的所有线程共享该进程下的所有资源;
- 线程在执行过程中,需要协作同步,不同进程的线程要利用消息通信的方法实现同步;
- 不仅进程之间可以并发执行,同一进程的多个线程也可以;
- 进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源;
参考非常形象的二者概念比喻图文:工厂与工人 —— 进程与线程
GCD消息列队各种执行情况
1、无列队执行
2、队列的异步和同步执行
-
异步执行
- 同步执行
队列的异步和同步执行输出结果: - 异步:可以看到结果是无序穿插打印输出的
- 同步:和主线程的无队列执行顺序结果一样
3、队列的优先级执行
// 队列的优先级执行
func queueWithQos() {
/**
Qos: Quality of Service 程序服务质量,用于控制队列执行的优先级
下面是优先级由低到高
unspecified
background
utility
default
userInitiated
userInteractive
*/
let queue1 = DispatchQueue(label: "kkk1", qos: .utility)
let queue2 = DispatchQueue(label: "kkk2", qos: .background)
queue1.async {
print("queue1当前线程 >>> \(Thread.current)")
for i in 0..<10 { print("🐶", i) }
}
queue2.async {
print("queue2当前线程 >>> \(Thread.current)")
for i in 100..<110 { print("🐳", i) }
}
for i in 1000..<1010 { print("🦞", i) }
}
列队优先级执行输出结果:🦞是在主线程中执行的,所以优先级是最高的,因为最先执行完成;🐶和🐳各自开启一个异步执行的线程,优先级utility > background,所以🐶会先执行完。它们两个属于不同的队列,故会穿插执行,如果都是一个队列,那么它们就会串行执行。
4、串行队列执行
串行队列执行输出结果:可以看到在同一线程中执行的代码是依次执行的。
5、并行队列执行
并行队列执行输出结果:可以看到其和串行队列的区别在于我们设置队列的属性attributes为concurrent,即开启并行队列,输出结果是同时穿插执行的。
6、监听任务的执行是否完成
全局队列,使用简单方便(不能滥用)
在上面的众多例子中,我们都是手动去创建队列演示执行过程,实际上,我们并不需要总是自己去手动创建队列,特别是当我们不需要考虑队列的优先级的时候。操作系统会创建一个后台队列的集合,也就是全局队列(global queue)。
let globalQueue1 = DispatchQueue.global()
// let globalQueue2 = DispatchQueue.global(qos: .utility)
globalQueue1.async {
// do something
}
到此基本涵盖介绍了GCD的一点点常规用法,在实际项目工程中要适当适时的使用多线程,便可优化项目性能。Swift的GCD用起来简洁和舒适,使用block的形式进行执行,当然要多多注意造成循环引用、内存泄漏的问题。
部分资料来源于网络,若侵权,请联系删除~
联系方式:kim77895pl@gmail.com
Kim 写于2020.8.14,希望文章能对你有所帮助。