博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ios29--多线程
阅读量:5775 次
发布时间:2019-06-18

本文共 2268 字,大约阅读时间需要 7 分钟。

进程是指在系统中正在运行的一个应用程序(一个程序可以对应多个进程)。

每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内。
比如同时打开迅雷、Xcode,系统就会分别启动2个进程。
1个进程要想执行任务,必须得有线程(进程是线程组成的,进程的所有任务都是线程完成的,每1个进程至少要有1条线程)。
1个线程中任务的执行是串行的。线程是串行的(一个一个的执行的),要在1个线程中执行多个任务,那么只能一个一个地按顺序执行这些任务,也就是说,在同一时间内,1个线程只能执行1个任务。

 

进程和线程的比较:
1.线程是CPU调用(执行任务)的最小单位。
2.进程是CPU分配资源和调度的单位。(cpu在分配资源是按进程为单位进行分配的,不会按照线程为单位进行分配。但是进程中的任务是线程完成的,所以线程是cpu执行的最小单位)。
3.一个程序可以对应多个进程,一个进程中可以有多个线程,但至少要有一个线程。
4.同一个进程内的线程共享进程的资源

 

多线程:
1.1个进程中可以开启多条线程,每条线程可以并行(同时)执行不同的任务.(线程内部是串行的,但是线程和线程是可以同时进行的)。
2.进程 —— 车间,线程 —— 车间工人
3.多线程技术可以提高程序的执行效率

 

多线程的原理:
1.同一时间,CPU只能处理1条线程,只有1条线程在工作(执行)
2.多线程并发(同时)执行,其实是CPU快速地在多条线程之间调度(切换)
3.如果CPU调度线程的时间足够快,就造成了多线程并发执行的假象(多核CPU就是真正的多线程了)
4.线程过多会造成cpu切换消耗过大(切换需要保存上下文),cpu累死。通常3-5个线程就可以了。

 

多线程的优缺点:

多线程的优点:
1.能适当提高程序的执行效率,能适当提高资源利用率(CPU、内存利用率)。

多线程的缺点:

1. 创建线程是有开销的(空间开销,时间开销),iOS下主要成本包括:内核数据结构(大约1KB)、栈空间(子线程512KB、主线程1MB,也可以使用-setStackSize:设置,但必须是4K的倍数,而且最小是16K),创建线程大约需要90毫秒的创建时间。
如果开启大量的线程,会降低程序的性能。
线程越多,CPU在调度线程上的开销就越大。
2. 程序设计更加复杂:比如线程之间的通信、多线程的数据共享(数据安全)。

主线程:
一个iOS程序运行后,默认会开启1条线程,称为“主线程”或“UI线程”。
主线程的主要作用:显示\刷新UI界面,处理UI事件(比如点击事件、滚动事件、拖拽事件等)。
主线程的使用注意:别将比较耗时的操作放到主线程中,耗时操作会卡住主线程,严重影响UI的流畅度,给用户一种“卡”的坏体验。

子线程:将耗时操作放在子线程(后台线程、非主线程)。

 

////  ViewController.m//  01-了解-耗时操作////  Created by xiaomage on 16/2/18.//  Copyright © 2016年 小码哥. All rights reserved.//#import "ViewController.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad {    [super viewDidLoad];        //1.获得主线程,主线程是不能手动开启的,主线程只有一个,是系统开启的,    NSThread *mainThread = [NSThread mainThread];    NSLog(@"%@",mainThread);// 
{number = 1, name = main} //2.获得当前线程,如果没有开启线程,默认就是主线程。 NSThread *currentThread = [NSThread currentThread]; NSLog(@"%@",currentThread);//
{number = 1, name = main} //3.判断主线程 //3.1 number == 1 //3.2 类方法 BOOL isMainThreadA = [NSThread isMainThread]; //3.3 对象方法 BOOL isMainThreadB = [currentThread isMainThread]; NSLog(@"%zd---%zd",isMainThreadA,isMainThreadB);//1,1}- (IBAction)btnClick:(id)sender {
//按钮的点击事件是主线程处理的。 for (NSInteger i = 0; i <10000; i++) { NSLog(@"%zd----%@",i,[NSThread currentThread]);//主线程进入这个方法,耗时,主线程出不来,此时外面的其他UI控件不能点击了。 } }@end

 

本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/7488617.html,如需转载请自行联系原作者

你可能感兴趣的文章
KVO原理分析及使用进阶
查看>>
【348天】每日项目总结系列086(2018.01.19)
查看>>
【294天】我爱刷题系列053(2017.11.26)
查看>>
Microsoft发布了Azure Bot Service和LUIS的GA版
查看>>
Google发布Puppeteer 1.0
查看>>
.NET开源现状
查看>>
可替换元素和非可替换元素
查看>>
2016/08/25 The Secret Assumption of Agile
查看>>
(Portal 开发读书笔记)Portlet间交互-PortletSession
查看>>
搭建vsftpd服务器,使用匿名账户登入
查看>>
AMD改善Linux驱动,支持动态电源管理
查看>>
JAVA中循环删除list中元素的方法总结
查看>>
Java虚拟机管理的内存运行时数据区域解释
查看>>
人人都会深度学习之Tensorflow基础快速入门
查看>>
ChPlayer播放器的使用
查看>>
js 经过修改改良的全浏览器支持的软键盘,随机排列
查看>>
Mysql读写分离
查看>>
Oracle 备份与恢复学习笔记(5_1)
查看>>
Oracle 备份与恢复学习笔记(14)
查看>>
分布式配置中心disconf第一部(基本介绍)
查看>>