多线程的开发
一.进程:
进程是app应用程序 例如:酷狗
二.线程:
线程是app应用执行的任务 例如:下载音乐,播放音乐
- 串行是按顺序一个一个执行
- 多线程是一个进程有多个线程,这些线程可以同时执行不同任务
三.CPU:
同一时间,CPU只能处理一条线程,多线程是cpu在不同线程之间调度.
注意:1.适当的多线程会提高cpu的利用率,内存利用率.
2.线程太多,cpu会累死,消耗大量的cpu资源.线程被调度的频次会降低
3.创建线程是有开销的,内核数据结构(大约1kb),栈空间(子线程512KB,主线程1MB,也可以使用-setStackSize:设置,但必须是4K的倍数,而且最小是16K),创建线程大约需要90ms的创建时间
4.程序设计更加复杂:比如线程之间的通信、多线程的数据共享
技术方案 | 简介 | 语言 | 生命周期 | 使用频率 |
pthread |
|
C | 程序员管理 | 几乎不用 |
NSThread |
|
OC | 程序员管理 | 偶尔使用 |
GCD |
|
OC | 自动管理 | 经常使用 |
NSOperation |
|
OC |
自动管理 | 经常使用 |
pthread的使用
//pthread 是属于 POSIX 多线程开发框架 (c语言多线程)
NSString * str = @"hello Hank";
pthread_t threadId;
// - 在 ARC 开发中,如果涉及到和C语言中的相同的数据类型进行转换,需要使用 __bridge "桥接"
// - 在 MRC 不需要
int result = pthread_create(&threadId, NULL, &demo, (__bridge void *)(str));
// 返回值: 如果是0,标示正确. 如果非0,标示错误代码
if (result == 0) {
NSLog(@"OK");
}
else{
NSLog(@"error %d",result);
}
void * demo(void * param){
NSLog(@"%@ %@",[NSThread currentThread],param);
return NULL;
}
NSThread的使用
1. //创建线程
NSThread * t = [[NSThread alloc]initWithTarget:self selector:@selector(theadStatus) object:nil];
t.name = @"Thread A"; //在大型的商业项目中,通常希望程序在崩溃的时候,能够获取到程序准确的所以在的线程!
/** 优先级翻转
优先级 只是保证 CPU 调度的可能性会高!
多线程目的:将耗时操作放在后台,不阻塞UI线程!
建议:在开发的时候,不要修改优先级, 在多线程开发中,不要相信一次的运行结果!!
*/
t.threadPriority = 0.1;//优先级 从 0.0 -- 1.0 默认值 0.5
[t start]; // 线程就绪(CPU翻牌)
[t sleep];//sleep 方法是类方法,会直接休眠当前线程!!
[NSThread exit];//exit 类方法,哥么终止当前线程!!!!
2.//创建线程
//detach ==> 分离
[NSThread detachNewThreadSelector:@selector(demo:) toTarget:self withObject:@"Detach"];
3.exit杀死线程,sleep线程休眠
[self performSelectorInBackground:@selector(starMainThread) withObject:nil];
[NSThread exit]; //注意!!! exit会杀掉主线程!但是APP不会挂掉!!
-(void)starMainThread
{
[NSThread sleepForTimeInterval:1.0];
[[NSThread mainThread] start]; //开启主线程!!
}
4.线程锁
//互斥锁 -- 保证锁内的代码,同一时间,只有一条线程执行!
//互斥锁 的范围 应该尽量小,范围大了 效率就差!!
//1.判断是否有票
//参数:任意OC对象都OK!一般用self!全局对象
//局部变量,每一个线程单独拥有的,因此没法加锁!!!
一种NSCondition ,一种是:NSLock。 后期补上..。
GCD 使用
NSOperation的使用