1、简单的可以想到,写一个while循环

    while (TRUE) {

    }

  但是这种方式存在缺陷,将导致CPU占用100%,两个核。

p.p1 { margin: 0; font: 12px "Hannotate SC"; -webkit-text-stroke: #000000; min-height: 17px }
span.s1 { font-kerning: none }

这种方式不优雅,会导致循环空转,占用大量CPU。即使在循环中加入sleep也不是特别好的方式。

2、在iOS中特有的方式,使用Runloop是否结束作为循环判断条件

  

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

  在创建的线程体中运行上面的代码,将输出:

2017-03-22 19:28:50.693824 NSThreadTest[3459:785928] hello 1

  这个时候线程像是阻塞在while处,而是处于休眠状态,当Runloop中有事件源的时候,线程会唤醒,并且执行处理对应事件的方法。

  看起来相当神奇!当线程结束的时候,会输出hello 3,此时的CPU占用如下

  

  除了以上实现方式之外,还有更优雅的实现:

 /*
//占用0%的CPU
BOOL shouldKeepRunning = YES; // global
NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
[runLoop addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode]; // adding some input source, that is required for runLoop to runing
while (shouldKeepRunning && [runLoop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]); // starting infinite loop which can be stopped by changing the shouldKeepRunning's value
*/ /*
//占用0%的CPU
@autoreleasepool {
NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
[runLoop addPort:[NSMachPort port] forMode:NSRunLoopCommonModes];
[runLoop run];
}
*/

  

3、总结

  iOS中的NSThread是对unix 中 pthread的一种封装,并加入了Runloop的概念,以这种事件驱动线程的方式优化整体性能,也方便线程的调度使用。

4、源代码

  https://github.com/liqiushui/NSThreadKeepAlive.git

p.p1 { margin: 0; font: 12px "Hannotate SC"; -webkit-text-stroke: #000000; min-height: 17px }
span.s1 { font-kerning: none }

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

  1. iOS 如何保持线程一直在运转(二)

    一.接着上一篇通过NSThread可以方便的创建一个线程,并且启动线程的Runloop,在线程体中执行一个while循环 然后我们就可以方便得利用这个线程了 - (void)threadRun:(NS ...

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

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

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

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

  4. iOS/OS X线程安全的基础知识

    处理多并发和可重入性问题,是每个库发展过程中面临的比较困难的挑战之一.在Parse平台上,我们尽最大的努力保证你在使用我的SDKs时所做的操作都是线程安全的,保证不会出现性能问题. 在这篇文章中我们将 ...

  5. iOS - 网络语线程(OC)

    1. 检测网络状态 - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the vi ...

  6. iOS基础 - 多线程线程

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

  7. iOS 多线程之线程锁Swift-Demo示例总结

    线程锁是什么 在前面的文章中总结过多线程,总结了多线程之后,线程锁也是必须要好好总结的东西,这篇文章构思的时候可能写的东西得许多,只能挤时间一点点的慢慢的总结了,知道了线程之后要了解线程锁就得先了解一 ...

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

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

  9. iOS开发之线程组解决请求多个接口数据,完成后,再刷新界面

    1.多任务请求接口,完成后,在刷新数据,常用方法 2018年07月18日 16:34:38 hbblzjy 阅读数:1382 版权声明:本文为博主原创文章,未经博主允许不得转载. https://bl ...

  10. IOS多线程之线程属性的配置

    版权声明:原创作品,谢绝转载!否则将追究法律责任.   设置线程堆栈的大小: 系统为每个你新创建的线程,都会为你的进程空间分配一定的内存作为该线程的堆栈.这里面有我们局部变量声明我们的方法就是一个堆栈 ...

随机推荐

  1. sql 语句系列(计算的进阶)[八百章之第十六章]

    前言 介绍两个实用的sql查询语句. 1.计算平均数时候,去除最大值和最小值. 2.修改累计值. 计算平均数时候,去除最大值和最小值 sql server: select AVG(sal) from( ...

  2. Android开发 Error:The number of method references in a .dex file cannot exceed 64K.Android开发 Error:The number of method references in a .dex file cannot exceed 64K

    前言 错误起因: 在Android系统中,一个App的所有代码都在一个Dex文件里面. Dex是一个类似Jar的存储了多有Java编译字节码的归档文件. 因为Android系统使用Dalvik虚拟机, ...

  3. 阿里云张新涛:连接产业上下游,构建XR协作生态

    简介: 用交互技术辅以澎湃的算力带给大家最真实的"沉浸式体验" 2022年9月2日,在世界人工智能大会"区块新生 数字宇宙--元宇宙技术与生态合作"分论坛上,阿 ...

  4. 云效故障定位研究论文被ICSE 2021 SEIP track收录

    近期,由阿里云云效团队联合复旦大学CodeWisdom研究团队.阿里技术风险部安全生产团队,合作完成的论文<MicroHECL: High-Efficient Root Cause Locali ...

  5. 【OpenYurt 深度解析】边缘网关缓存能力的优雅实现

    简介: 阿里云边缘容器服务上线 1 年后,正式开源了云原生边缘计算解决方案 OpenYurt,跟其他开源的容器化边缘计算方案不同的地方在于:OpenYurt 秉持 Extending your nat ...

  6. Oracle数据到MaxCompute乱码问题详解

    ​简介:集成Oracle数据到MaxCompute,乱码问题分析: 为什么,在oracle数据不乱码,集成到MaxCompute就乱码了? 问题在哪里? 1.1 乱码现象 DataWorks的数据离线 ...

  7. 解决 Serverless 落地困难的关键,是给开发者足够的“安全感”

    ​简介:越来越多的云产品都会向全托管.Serverless 形态演进.当云的产品体系 Serverless 化达到一个临界值,通过函数计算这样的 Serverless 计算服务结合其他 Serverl ...

  8. games101-3 BRDF101

    BRDF101 概述 本文基于知乎Maple对brdf的文章,在此基础又收集了一些其它来源的关于brdf的文章,希望能够完全理解记忆相关知识 关于Jakub Boksansky的文章,看的过程中又去搜 ...

  9. C语言程序设计-笔记5-数据类型和表达式

    C语言程序设计-笔记5-数据类型和表达式 例6-1  大小写英文字母转换.输入一样字符,将其中的大写字母转换为相应的小写字母后输出,小写字母转换为相应的大写字母后输出,其他字符按原样输出. #incl ...

  10. 04.Java 流程控制

    1.用户交互 Scanner Scanner 对象:获取用户的输入 基本语法:Scanner s = new Scanner(System.in); 通过 Scanner 类的 next() 和 ne ...