1.线程的含义
了解线程之前,我们要分清楚程序,进程和线程三者的区别.程序是指由源代码生成的可执行的应用(例如 QQ.app);一个正在运行的程序可以看做是一个进程,进程拥有独立运行所需的全部资源(正在运行的 QQ);而线程是指程序中独立运行的代码段(接收 QQ 消息的代码).
2.为什么要使用多线程
当用户执行某项操作如上传图片,主线程会执行此操作.直到上传结束,主线程才能继续后面的工作.在这期间,主线程处于"忙碌"状态,不会对用户的请求作出任何反应.既然单一线程不能满足需要,就需要添加线程进行操作.在用户要进行上述操作是可以启动一个独立的线程来专门负责这项操作.这样一来,两个线程并行不悖,各司其职.
3.多线程简单认识
3.1多线程的几种形式
3.1.1pthread的简单认识
创建线程指针
pthread_t pthread;
//第一个参数:线程指针//第二个参数:线程属性//第三个参数:函数指针 用于执行方法//第四个参数:线程传值
pthread_create(&pthread, NULL, run, NULL);
3.1.2NSThread
注意事项:每个线程都维护着与自己对应的 NSAutoreleasePool对象,将其放在线程栈的栈顶,当线程结束时,会清空自动释放池;为保证对象的及时释放,在多线程方法中需要添加自动释放池;在应用程序打开时,系统会自动为主线程创建自动释放池.
3.1.3NSObject
- (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg后台执行
3.1.4NSOperationQuene
操作队列
目的:是将我们的任务放在一个队列中执行
任务:任务执行在主线程还是在子线程全都是由我们的队列来决定的
加入到队列 队列:先加的先执行,后加的后执行,但是执行的时间不一定 可能后执行的比先执行的先执行完
3.1.5GCD(Grand Central Dispatch)是 Apple 开发的多核编程技术
GCD 主要分串行队列和并行队
//异步:不在一个线程执行
//同步:在同一个线程执行
//串行:串在一起执行
//并行:一起执行
/*
*异步+并发队列 具备开辟子线程的能力,并发执行任务
*/
- (void)creatAsyncConcurrent
{
dispatch_queue_tqueue =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
dispatch_async(queue, ^{
NSLog(@"1---------%@",[NSThreadcurrentThread]);
});
dispatch_async(queue, ^{
NSLog(@"2---------%@",[NSThreadcurrentThread]);
});
dispatch_async(queue, ^{
NSLog(@"3---------%@",[NSThreadcurrentThread]);
});
}
/*
*同步+并发队列不具备开辟线程的能力,并发的功能也就没用了
*/
- (void)creatSyncConcurrent
{
//我们自己创建的并发队列
//第一个参数:队列的名字
//第二个参数:类型
//dispatch_queue_t queue = dispatch_queue_create("ddd", DISPATCH_QUEUE_CONCURRENT);
//获得全局的并发队列
//第一个参数:为一个优先级,默认的就行
dispatch_queue_tqueue =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
dispatch_sync(queue, ^{
NSLog(@"1-----------%@",[NSThreadcurrentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"2-----------%@",[NSThreadcurrentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"3-----------%@",[NSThreadcurrentThread]);
});
}
/*
*异步+串行 具备开辟线程的能力,但是任务是串行的,执行完一个才回去执行下一个
*/
- (void)creatAsyncSerial
{
dispatch_queue_tqueue =dispatch_queue_create("bbb",DISPATCH_QUEUE_SERIAL);
dispatch_async(queue, ^{
NSLog(@"1-----------%@",[NSThreadcurrentThread]);
});
dispatch_async(queue, ^{
NSLog(@"2-----------%@",[NSThreadcurrentThread]);
});
dispatch_async(queue, ^{
NSLog(@"3-----------%@",[NSThreadcurrentThread]);
});
}
/*
*同步+串行队列不具备开辟线程的能力,在当前线程完成
*/
- (void)creatSyncSerial
{
//创建串行队列
dispatch_queue_tqueue =dispatch_queue_create("aaa",DISPATCH_QUEUE_SERIAL);
dispatch_sync(queue, ^{
NSLog(@"1-----%@",[NSThreadcurrentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"2-----%@",[NSThreadcurrentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"3-----%@",[NSThreadcurrentThread]);
});
}
/*
*异步+主队列 不开辟线程,就在主线程执行
*/
- (void)creatAsyncMain
{
dispatch_queue_tqueue =dispatch_get_main_queue();
dispatch_async(queue, ^{
NSLog(@"1------------%@",[NSThreadcurrentThread]);
});
dispatch_async(queue, ^{
NSLog(@"2------------%@",[NSThreadcurrentThread]);
});
dispatch_async(queue, ^{
NSLog(@"3------------%@",[NSThreadcurrentThread]);
});
}
/*
*同步+主队列
*/
- (void)creatSyncMain
{
//获得主队列(主队列也是一个串行队列)
dispatch_queue_tqueue =dispatch_get_main_queue();
//将任务加到队列中
//第一个参数:队列
//第二个参数:要执行的任务
dispatch_sync(queue, ^{
NSLog(@"1-----------------%@",[NSThreadcurrentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"2-----------------%@",[NSThreadcurrentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"3-----------------%@",[NSThreadcurrentThread]);
});
}
GCD 常用异步并行队列.
网友评论