一、接着上一篇通过NSThread可以方便的创建一个线程,并且启动线程的Runloop,在线程体中执行一个while循环

  然后我们就可以方便得利用这个线程了

- (void)threadRun:(NSThread *)thread
{
NSLog(@"Thread run");
NSLog(@"hello 1");
while (!_isCancelled && [currentRunLoop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]])
{
NSLog(@"hello 2");
_isCancelled = [currentThread isCancelled];
}
NSLog(@"hello 3");
}

二、那我们应该如何正确结束一个NSThread呢

  NSThread结束可以调用两个方法,一个是对象方法-[Thread cancel],这个方法标记NSThraed的属性isCanceled为YES,那么通过配合上面的循环,线程体本身就结束了。

                  另外一个方法是+[Thread exit],注意这个方法需要在NSThraed为当前线程中调用,该方法比较暴力不管线程中的任务是否还在执行,

                                  直接结束,也不管runloop,因此可能带来内存泄露。

三、NSRunloop

  - (BOOL)runMode:(NSRunLoopMode)mode beforeDate:(NSDate *)limitDate;

  根据官方文档,上面的API在Runloop中没有事件源或者timer的时候,该方法会立即返回NO,所以在执行这个线程体的循环时候,需要先加入一个timer

  保证while循环不会结束,也就保证了线程不会结束

- (void)threadRun:(NSThread *)thread
{
NSLog(@"Thread run"); _liveTimer = [NSTimer scheduledTimerWithTimeInterval:[[NSDate distantFuture] timeIntervalSinceNow]
target:self
selector:@selector(ignore:)
userInfo:nil
repeats:YES]; NSThread *currentThread = [NSThread currentThread];
NSRunLoop *currentRunLoop = [NSRunLoop currentRunLoop]; _isCancelled = [currentThread isCancelled]; NSLog(@"hello 1");
while (!_isCancelled && [currentRunLoop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]])
{
NSLog(@"hello 2");
_isCancelled = [currentThread isCancelled];
NSLog(@"hello 4");
}
NSLog(@"hello 3"); }

上面的含义另外一层意思就是,只要循环结束,线程体结束,那么NSThread也就结束,NSThread中的Runloop也结束了,而不管Runloop中的什么事件有没有执行完

 那么一旦Runloop起来之后,将Runloop中的事件全部移除之后,Runloop是否会自动结束呢

  

- (void)stopThread:(NSThread *)thread
{
//[self performSelector:@selector(stopThread:) withObject:thread afterDelay:5];
[_liveTimer invalidate];
//CFRunLoopStop(CFRunLoopGetCurrent());
//[thread cancel];
//_isCancelled = YES;
//while ([thread isExecuting] == YES) usleep(10000);
NSLog(@"stop done"); } - (void)ignore:(NSTimer *)timer
{
NSLog(@"ignore");
} - (void)threadRun:(NSThread *)thread
{
NSLog(@"Thread run"); //占用0%的CPU _liveTimer = [NSTimer scheduledTimerWithTimeInterval:[[NSDate distantFuture] timeIntervalSinceNow]
target:self
selector:@selector(ignore:)
userInfo:nil
repeats:YES]; NSThread *currentThread = [NSThread currentThread];
NSRunLoop *currentRunLoop = [NSRunLoop currentRunLoop]; _isCancelled = [currentThread isCancelled]; NSLog(@"hello 1");
while (/*!_isCancelled && */[currentRunLoop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]])
{
NSLog(@"hello 2");
//_isCancelled = [currentThread isCancelled];
NSLog(@"hello 4");
}
NSLog(@"hello 3"); }

  上面的代码中去除了cancel标记,那么即使timer移除,这个while还在一直保持循环,因为- (BOOL)runMode:(NSRunLoopMode)mode beforeDate:(NSDate *)limitDate;不会返回第二次值

  那么如果没有while循环了呢,这个线程体也就真正结束啦

  

iOS 如何保持线程一直在运转(二)的更多相关文章

  1. 【疯狂造轮子-iOS】JSON转Model系列之二

    [疯狂造轮子-iOS]JSON转Model系列之二 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇<[疯狂造轮子-iOS]JSON转Model系列之一> ...

  2. iOS开发-UI 从入门到精通(二)

    iOS开发-UI 从入门到精通(二)是对 iOS开发-UI 从入门到精通(一)知识点的巩固,主要以习题练习为主,增强实战经验,为以后做开发打下坚实的基础! ※开发环境和注意事项: 1.前期iOS-UI ...

  3. iOS开发UI篇—Quartz2D简单使用(二)

    iOS开发UI篇—Quartz2D简单使用(二) 一.画文字 代码: // // YYtextview.m // 04-写文字 // // Created by 孔医己 on 14-6-10. // ...

  4. IOS 多线程,线程同步的三种方式

    本文主要是讲述 IOS 多线程,线程同步的三种方式,更多IOS技术知识,请登陆疯狂软件教育官网. 一般情况下我们使用线程,在多个线程共同访问同一块资源.为保护线程资源的安全和线程访问的正确性. 在IO ...

  5. [并发并行]_[线程模型]_[Pthread线程使用模型之二 工作组work crew]

    Pthread线程使用模型之二工作组(Work crew) 场景 1.一些耗时的任务,比如分析多个类型的数据, 是独立的任务, 并不像 pipeline那样有序的依赖关系, 这时候pipeline就显 ...

  6. JUC源码分析-线程池篇(二)FutureTask

    JUC源码分析-线程池篇(二)FutureTask JDK5 之后提供了 Callable 和 Future 接口,通过它们就可以在任务执行完毕之后得到任务的执行结果.本文从源代码角度分析下具体的实现 ...

  7. 【原】iOS多线程之线程间通信和线程互斥

    线程间通信 1> 线程间通信分为两种 主线程进入子线程(前面的方法都可以) 子线程回到主线程 2> 返回主线程 3> 代码 这个案例的思路是:当我触摸屏幕时,会在子线程加载图片,然后 ...

  8. iOS基础 - 多线程线程

    一.多线程的应用 l 充分发挥多核处理器的优势,并发(同时执行)执行任务让系统运行的更快.更流畅 二.进程与线程概念 l 一个运行的程序就是一个进程或者叫做一个任务 l 一个进程至少包含一个线程,线程 ...

  9. iOS开发之线程间的MachPort通信与子线程中的Notification转发

    如题,今天的博客我们就来记录一下iOS开发中使用MachPort来实现线程间的通信,然后使用该知识点来转发子线程中所发出的Notification.简单的说,MachPort的工作方式其实是将NSMa ...

随机推荐

  1. 通过实例解释LinuxC下argc,argc[]的意义

    MarkdownPad Document html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,ab ...

  2. 利用 UltraEdit 重新排版 XML 结构数据

    我们在工作常碰到这种情况,通讯数据或文件数据是以 XML 结构形式保存的,但通常 XML 结构比较混乱,不易分析.现在我们利用 UltraEdit32对该类型数据做 Reformat,具体操作如下: ...

  3. MyEclipse - 解决 MyEclipse build workspace慢,validation javascript更慢的问题

    在这个过程中对.projet文件进行了跟踪比对,总算发现这个Build的时候进行Validation是从哪里定义的了.似乎因为我的项目是基于ExtJS2.0.2的web project,所以会提示打开 ...

  4. table中td的宽度不随文字变宽

    1.设置了table的宽度后,宽度仍然不固定,td的内容一多,很容易吧table撑变形.有些时候我们需要设置固定的宽度. 解决办法 table的css 加入样式  table-layout:fixed ...

  5. JAVA中的数据结构 - 1,红黑树

    背景: 在JDK源码中, 有treeMap和JDK8的HashMap都用到了红黑树去存储 红黑树可以看成B树的一种: 二叉树-->搜索二叉树-->平衡搜索二叉树-->B树--> ...

  6. 在vi或者vim中显示行号

    1. 为了显示行号,在vi/vim编辑器中执行一下命令中的一条 :set number 或者 :set nu 2. 为了关闭行号,在vi/vim编辑器中执行下面命令 :set nu! 如果你想要每次启 ...

  7. ACM 海贼王之伟大航路(深搜剪枝)

    "我是要成为海贼王的男人!" 路飞他们伟大航路行程的起点是罗格镇,终点是拉夫德鲁(那里藏匿着"唯一的大秘宝"--ONE PIECE).而航程中间,则是各式各样的 ...

  8. 丘吉尔,最后一次演讲-Never Give Up

    丘吉尔一生最精彩的演讲,也是他最后一次演讲.在剑桥大学的一次毕业典礼上,整个会堂有上万个学生,他们正在等待丘吉尔的出现.正在这时,丘吉尔在他的随从陪同下走进了会场并慢慢走向讲台,他脱下他的大衣交给随从 ...

  9. 微信小程序,超能装的实例教程

    序言 开始开发应用号之前,先看看官方公布的「小程序」教程吧!(以下内容来自微信官方公布的「小程序」开发指南) 本文档将带你一步步创建完成一个微信小程序,并可以在手机上体验该小程序的实际效果.这个小程序 ...

  10. JS事件绑定深入

    W3C很好地解决了覆盖问题.相同函数屏蔽的问题.this传递问题.添加额外方法不被覆盖等问题. 但是IE8之前的版本并不支持,IE9已完全支持了. IE和W3C在事件绑定上存在很多差异,我们以冒泡和捕 ...