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

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

1 轻量级线程 NSThread

#####什么是NSThread?

基于线程使用 轻量级的多线程编程方法 一个NSThread对象代表一个线程 需要手动管理 线程的生命周期 处理线程同步

// 1 动态创建

NSThread *newThread = [NSThread alloc] initWithTarget:self selector:@slector(threadRun) object:nil];复制代码

// 2 静态创建

[NSThread detachNewThreadSelector:@selector(threadRun) toTarget:self withObject:nil];复制代码

// 3 线程开启

[newThread start];复制代码

// 4 线程暂停 会阻塞当前的线程

[NSThread sleepForTimeInterval:1.0];[NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:1.0];复制代码

// 5 线程取消 不会停止线程 只做 状态记录

[newthread cancel];复制代码

// 6 线程停止 // 立即终止除了主线程并退出线程所有的线程并退出 需要在掌握所有线程状态情况调用 否则内存问题

[NSThread exit];复制代码

// 7 获取当前线程

[NSThread currentThread];复制代码

// 8 获取主线程

[NSThread mainThread];复制代码

// 9 线程优先级

[newThread setQualityOfService:NSQualityOfServiceUserInteractive]复制代码

// NSQualityOfServiceUserInteractive:最高优先级,用于用户交互事件

 NSQualityOfServiceUserInitiated:次高优先级,用于用户需要马上执行的事件
 NSQualityOfServiceDefault:默认优先级,主线程和没有设置优先级的线程都默认为这个优先级
 NSQualityOfServiceUtility:普通优先级,用于普通任务
 NSQualityOfServiceBackground:最低优先级,用于不重要的任务

线程间通信

// 1 指定当前线程执行操作

[self performSelector:@selector(threadRun)];[self performSelector:@selector(threadRun) withObject:nil];[self performSelector:@selector(threadRun) withObject:nil afterDelay:1];复制代码

// 2 (在其他线程中)指定主线程执行操作 // 更新UI在主线程执行

[self performSelectorOnMainThread:@selector(threadRun) withObject:nil waitUntilDone:YES];复制代码

// 3 (在主线程)指定其他线程执行操作

// 指定为某个线程

[self performSelector:@selector(threadRun) onThread:newThread withObject:nil waitUntilDone:YES];复制代码

// 后台线程

[self performSelectorInBackground:@selector(threadRun) withObject:nil];复制代码
线程同步

// 一段时间只可以某一个线程访问某个资源

// 线程加锁 NSLock @synchronized

处理例子

// 监听线程退出的通知

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(threadExitNotifation) name:NSThreadWillExitNotification object:nil    ];    self.tickedCount = 50;        // 创建线程    NSThread *window1 = [[NSThread alloc] initWithTarget:self selector:@selector(saleTicket) object:nil];    window1.name = @"beijing";    [window1 start]; // 开始线程        NSThread *window2 = [[NSThread alloc] initWithTarget:self selector:@selector(saleTicket) object:nil                         ];    window2.name = @"guanzhou";    [window2 start];    // 线程执行完推出 持续使用 售票 加循环- (void)saleTicket{        while (1) {                // 解决线程同步问题        @synchronized(self) {            if (self.tickedCount > 0) { // 如果还有票                self.tickedCount -- ;                NSLog(@"%@", [NSString stringWithFormat:@"剩余票数 %li 窗口 %@", (long)self.tickedCount, [NSThread currentThread].name]); // 获取线程的名字 当前线程                [NSThread sleepForTimeInterval:0.2];// 线程暂停 阻塞线程                            } else {                break;            }        }            }}复制代码

// 线程持续运行和退出 // 使用runloop 一直运行

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(threadExitNotifation) name:NSThreadWillExitNotification object:nil     ];    self.tickedCount = 50;        // 创建线程    NSThread *window1 = [[NSThread alloc] initWithTarget:self selector:@selector(thread1) object:nil];    [window1 start]; // 开始线程        NSThread *window2 = [[NSThread alloc] initWithTarget:self selector:@selector(thread2) object:nil];    [window2 start];        // 指派任务给线程 两个线程执行相同任务    [self performSelector:@selector(saleTicket) onThread:window1 withObject:nil waitUntilDone:NO];    [self performSelector:@selector(saleTicket) onThread:window2 withObject:nil waitUntilDone:NO];    //- (void)thread1{        [NSThread currentThread].name = @"beijing";    NSRunLoop *runLoop = [NSRunLoop currentRunLoop];    [runLoop runUntilDate:[NSDate date]]; // 一直运行}//- (void)thread2{    [NSThread currentThread].name = @"guanzhou";    NSRunLoop *runLoop1 = [NSRunLoop currentRunLoop];    [runLoop1 runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:10.0]];    // 自定义运行时间}- (void)threadExitNotifation{		@synchronized(self) {				if(self.tickedCount > 0) {				self.tickedCount --;				// 线程暂停 阻塞线程				[NSThread sleepForTimeInterval:0.2];				} else {								// 线程退出				if([NSThread currentThread].isCancelled) {				// 当前线程标记为取消状态				[NSThread currentThread] cancel];				// 停止当前的线程 runloop				CFRunLoopStop(CFRunLoopGetCurrent());				}				}		}}复制代码

转载于:https://juejin.im/post/5a31d41d6fb9a045167d32ef

你可能感兴趣的文章
python中pyquery无法获取标签名的dom节点
查看>>
面试官:请手写一个webpack4.0配置
查看>>
有关getter 和 setter的使用
查看>>
JavaScript面向对象中的Function类型个人分享
查看>>
记录一次Webpack插件优化的经历
查看>>
【跃迁之路】【505天】程序员高效学习方法论探索系列(实验阶段262-2018.06.25)...
查看>>
ubuntu16.04 搭建java 环境
查看>>
关于 try 和 finally 中的 return
查看>>
JS 1-数据类型
查看>>
(Google I/O '17) Speeding Up Your Android Gradle Builds 在本地的实践
查看>>
最大似然法与似然函数
查看>>
SAPGUI里实现自定义的语法检查
查看>>
快速创建 HTML5 Canvas 电信网络拓扑图
查看>>
JS动画之定时器详解
查看>>
利用Tomcat发布基于Maven所构建的Jersey RESTful Web Service
查看>>
PHP之string之wordwrap()函数使用
查看>>
ABAP OPEN SQL里OPEN CURSOR和SELECT的比较
查看>>
【348天】我爱刷题系列107(2018.01.19)
查看>>
四谈快速排序(含尾递归)
查看>>
WPF 下的自定义控件以及 Grid 中控件的自适应
查看>>