iOS 多线程开发(二)
2016-06-21 16:51
351 查看
上一节我们了解了那么多的有关多线程的理解,接下来我会一一写每一个开辟子线程的代码,演示怎么使用,光说不练,就是笨蛋,别光看,伸出双手,我们一起撸啊撸!
第一种方法:pthread
补充一下:
dispatch_sync :同步,不具备开线程的能力;
dispatch_async :异步,具备开线程的能力;
串行队列:一个任务执行完后,再执行下一个任务;
并发队列:多个任务可以同时执行;
那么问题来了,既然就有四种处理方法:
同步--串行队列(很少用);
同步--并行队列(很少用);
异步--串行队列(有时用);
异步--并行队列(常用);
接下来,我只介绍 异步--并行队列
代码如下:
第四种方法:NSOperationQueue
这里涉及到线程通信;
扩充:对多线程安全访问统一资源安全问题:
代码:
第一种方法:pthread
#import "ViewController.h" #import <pthread.h> @interface ViewController () @end @implementation ViewController void *download(void *data) { //耗时操作 for (int i = 0; i < 100000; i++) { NSLog(@"thread = %@",[NSThread currentThread]); } return NULL; } - (void)viewDidLoad { [super viewDidLoad]; //创建线程 pthread_t myThread; pthread_create(&myThread, NULL, download, NULL); } @end第二种方法:NSTread,补充一下,只要子线程结束以后就死了,不能复生了,和人死了一样,人死不能复生;
#import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; } //方法一 - (void)download { //耗时操作 for (int i = 0; i < 10000; i++) { NSLog(@"download = %@",[NSThread currentThread]); } } //方法二 - (void)download2 { //耗时操作 for (int i = 0; i < 10000; i++) { NSLog(@"download2 = %@",[NSThread currentThread]); } } //方法三 - (void)download3 { //耗时操作 for (int i = 0; i < 10000; i++) { NSLog(@"download3 = %@",[NSThread currentThread]); } } //点击屏幕执行的方法 -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { //创建子线程:方法一 NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(download) object:nil]; [thread start]; //创建子线程:方法二 [NSThread detachNewThreadSelector:@selector(download2) toTarget:self withObject:nil]; //创建子线程:方法三 [self performSelectorInBackground:@selector(download3) withObject:nil]; } @end第三种方法:GCD
补充一下:
dispatch_sync :同步,不具备开线程的能力;
dispatch_async :异步,具备开线程的能力;
串行队列:一个任务执行完后,再执行下一个任务;
并发队列:多个任务可以同时执行;
那么问题来了,既然就有四种处理方法:
同步--串行队列(很少用);
同步--并行队列(很少用);
异步--串行队列(有时用);
异步--并行队列(常用);
接下来,我只介绍 异步--并行队列
代码如下:
#import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; } -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { dispatch_queue_t gQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async(gQueue, ^{ //耗时处理; for (int i = 0 ; i < 1000; i++) { NSLog(@"我最耗时-----%@",[NSThread currentThread]); } }); dispatch_async(gQueue, ^{ //耗时处理; for (int i = 0 ; i < 1000; i++) { NSLog(@"我最耗时-----%@",[NSThread currentThread]); } }); dispatch_async(gQueue, ^{ //耗时处理; for (int i = 0 ; i < 1000; i++) { NSLog(@"我最耗时-----%@",[NSThread currentThread]); } }); dispatch_async(gQueue, ^{ //耗时处理; for (int i = 0 ; i < 1000; i++) { NSLog(@"我最耗时-----%@",[NSThread currentThread]); } }); } @end
第四种方法:NSOperationQueue
这里涉及到线程通信;
#import "ViewController.h" @interface ViewController () @property (nonatomic,strong) NSOperationQueue *queue; @end @implementation ViewController -(NSOperationQueue *)queue { if (!_queue) { _queue = [[NSOperationQueue alloc] init]; } return _queue; } - (void)viewDidLoad { [super viewDidLoad]; NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{ int count = 100000; for (int i = 0; i < 10000; i++) { NSLog(@"我最耗时 = %@",[NSThread currentThread]); count--; } //线程通讯,到主线程执行打印count [[NSOperationQueue mainQueue] addOperationWithBlock:^{ NSLog(@"执行完啦 = %d",count); }]; }]; [self.queue addOperation:operation]; } @end
扩充:对多线程安全访问统一资源安全问题:
代码:
#import "ViewController.h" @interface ViewController () /** * 模拟买票,剩余票数 */ @property (nonatomic,assign) int ticketCount; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; //比如剩余 10 张票 self.ticketCount = 10; } - (void)saleTicket { while (1) { //解决线程安全 @synchronized(self) { int count = self.ticketCount; if (count > 0) { self.ticketCount = count - 1; NSLog(@"买一张,剩余 %d 张",self.ticketCount); } else { return; } } } } //点击屏幕执行的方法 -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { //创建子线程:方法一 NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(saleTicket) object:nil]; [thread start]; //创建子线程:方法二 [NSThread detachNewThreadSelector:@selector(saleTicket) toTarget:self withObject:nil]; //创建子线程:方法三 [self performSelectorInBackground:@selector(saleTicket) withObject:nil]; } @end如果转载请注明转于:AirZilong的博客
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- C#线程间不能调用剪切板的解决方法
- C#线程同步的三类情景分析
- C#获取进程或线程相关信息的方法
- 简单对比C#程序中的单线程与多线程设计
- C#停止线程的方法
- C#子线程更新UI控件的方法实例总结
- C#线程队列用法实例分析
- C++使用CriticalSection实现线程同步实例
- 基于C++实现的线程休眠代码
- VB读取线程、句柄及写入内存的API代码实例
- C#网络编程基础之进程和线程详解
- C#通过Semaphore类控制线程队列的方法
- C#多线程处理多个队列数据的方法