NSThread是轻量级的多线程开发,OC语言编写,更加面向对象,使用起来也并不复杂,但是使用NSThread需要自己管理线程生命周期,如果长期运行还要考虑内存释放的问题,比如自动释放池的创建于销毁。在iOS开发中很少使用它来创建一个线程,但是经常使用它做一些延时操作,获取当前线程,线程间通讯等等。

  但是,在线程同步方面,控制线程执行顺序比较麻烦,线程同步对数据的加锁会有一定的系统开销,且创建线程也会增加系统的开销。

  1 创建方法

  有多种创建方法,- (void)runDemo:(NSString *)param;为要执行的示例方法。

- (void)runDemo:(NSString *)param {
NSThread *current = [NSThread currentThread];
NSLog(@"%@---%@ is running", param, current);
}
/// 方式1 自动创建线程, 并且自动启动
- (void)threadCreateOne {
// 在另一个线程执行 runDemo:
[self performSelectorInBackground:@selector(runDemo:) withObject:@"One"];
} /// 方式2 创建完线程直接(自动)启动
- (void)threadCreateTwo {
[NSThread detachNewThreadSelector:@selector(runDemo:) toTarget:self withObject:@"Two"];
} /// 方式3 先创建初始化线程,然后start开启线程
- (void)threadCreateThree {
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(runDemo:) object:@"Three"];
// 可以设置线程名字
thread.name = @"名字";
// 开启线程
[thread start];
}

  下面为测试代码,以及打印结果,我们调用的顺序是One->Two->Three,但是打印结果是Two->Three->One,因为线程启动后仅仅处于就绪状态,实际是否执行要由CPU根据当前状态调度,即执行顺序是无序的,这也是多线程的特点。

/// 点击屏幕后创建线程
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
[self threadCreateOne];
[self threadCreateTwo];
[self threadCreateThree];
} 打印结果:
-- ::34.974 01test[:] Two---<NSThread: 0x7ff250e1c9a0>{number = , name = (null)} is running
-- ::34.974 01test[:] Three---<NSThread: 0x7ff250e168a0>{number = , name = 名字} is running
-- ::34.974 01test[:] One---<NSThread: 0x7ff250f406a0>{number = , name = (null)} is running

  2 常用函数

  获取当前线程,获取主线程,判断当前线程是否为主线程。

// 获取当前线程
NSThread *current = [NSThread currentThread];
// 获取主线程
current = [NSThread mainThread];
// 判断当前线程是否为主线程
BOOL isMain = [current isMainThread];

  暂停线程,下面代码为2种方法均让当前线程睡5s

[NSThread sleepForTimeInterval:];
NSDate *date = [NSDate dateWithTimeInterval: sinceDate:[NSDate date]];
[NSThread sleepUntilDate:date];

  获取线程的状态,分别为:正在执行、已经完成、已经取消。

@property (readonly, getter=isExecuting) BOOL executing;
@property (readonly, getter=isFinished) BOOL finished;
@property (readonly, getter=isCancelled) BOOL cancelled;

  在指定的线程(已存在的线程)、主线程、当前线程上执行方法。这种比较常用,通常用于线程间通讯,且它们是NSObject的扩展方法,使用起来很方便。

// 在指定的线程执行runDemo:方法,最后的YES代表:下面的代码会阻塞,等runDemo:方法在thread线程执行完毕后,才会执行下面代码的下一行代码,设为NO则不阻塞。那么runDemo:与下一行代码的执行顺序不确定
[self performSelector:@selector(runDemo:) onThread:thread withObject:nil waitUntilDone:YES];
// 在主线程执行runDemo:方法,YES参数同上
[self performSelectorOnMainThread:@selector(runDemo:) withObject:nil waitUntilDone:YES];
// 在当前线程执行方法
[self performSelector:@selector(run) withObject:nil];

  退出线程:杀死线程,会阻碍线程内部自身的清理工作,所以最好让线程自己正常退出,而不是类似exit()这样的强制退出,(虽然很方便)

+ (void)exit;

  线程优先级相关,优先级范围是0.0 ~ 1.0,默认0.5,值越大,优先级越高。开发时,很少使用优先级,如果设置优先级且使用线程锁会造成优先级翻转,需要特备注意。

+ (double)threadPriority;
+ (BOOL)setThreadPriority:(double)p;

iOS多线程实现2-NSThread的更多相关文章

  1. iOS 多线程学习笔记 —— NSThread

    本文复制.参考自文章:iOS多线程编程之NSThread的使用  ,主要为了加强个人对知识的理解和记忆,不做他用.原作者声明: 著作权声明:本文由http://blog.csdn.net/totogo ...

  2. iOS多线程编程之NSThread的使用

      目录(?)[-] 简介 iOS有三种多线程编程的技术分别是 三种方式的有缺点介绍 NSThread的使用 NSThread 有两种直接创建方式 参数的意义 PS不显式创建线程的方法 下载图片的例子 ...

  3. iOS多线程编程之NSThread的使用(转)

    本文由http://blog.csdn.net/totogo2010/原创 1.简介: 1.1 iOS有三种多线程编程的技术,分别是: 1..NSThread 2.Cocoa NSOperation  ...

  4. [转]iOS多线程编程之NSThread的使用

    1.简介: 1.1 iOS有三种多线程编程的技术,分别是: 1..NSThread 2.Cocoa NSOperation (iOS多线程编程之NSOperation和NSOperationQueue ...

  5. iOS 多线程 简单学习NSThread NSOperation GCD

    1:首先简单介绍什么叫线程 可并发执行的,拥有最小系统资源,共享进程资源的基本调度单位. 共用堆,自有栈(官方资料说明iOS主线程栈大小为1M,其它线程为512K). 并发执行进度不可控,对非原子操作 ...

  6. iOS多线程编程之NSThread的使用(转载)

    1.简介: 1.1 iOS有三种多线程编程的技术,分别是: 1.NSThread 2.Cocoa NSOperation (iOS多线程编程之NSOperation和NSOperationQueue的 ...

  7. IOS 多线程02-pthread 、 NSThread 、GCD 、NSOperationQueue、NSRunLoop

    注:本人是翻译过来,并且加上本人的一点见解. 要点: 1.前言 2.pthread 3.NSThread 4.Grand Central Dispatch(GCD) 5.Operation Queue ...

  8. iOS多线程开发之NSThread

    一.NSThread基本概念 NSThread是基于线程使用,轻量级的多线程编程方法(相对GCD和NSOperation),一个NSThread对象代表一个线程,需要手动管理线程的生命周期,处理线程同 ...

  9. iOS多线程篇:NSThread简单介绍和使用

    一.什么是NSThread NSThread是基于线程使用,轻量级的多线程编程方法(相对GCD和NSOperation),一个NSThread对象代表一个线程, 需要手动管理线程的生命周期,处理线程同 ...

  10. ios 多线程 面试

    1 多线程是什么  同步完成多项任务,提高了资源的使用效率,从硬件.操作系统.应用软件不同的角度去看,多线程被赋予不同的内涵,对于硬件,现在市面上多数的CPU都是多核的,多核的CPU运算多线程更为出色 ...

随机推荐

  1. ABZ理论

    前言 身为著名的创业者+投资人,LinkedIn和Paypal的联合创始人Reid Hoffman有一个令我印象深刻的ABZ理论,他认为,你在任何时刻,手中都需要有三个计划:A计划.B计划和Z计划. ...

  2. 应用程序框架实战十三:DDD分层架构之我见

    前面介绍了应用程序框架的一个重要组成部分——公共操作类,并提供了一个数据类型转换公共操作类作为示例进行演示.下面准备介绍应用程序框架的另一个重要组成部分,即体系架构支持.你不一定要使用DDD这样的架构 ...

  3. Windows Server 2008 R2 WEB服务器配置系列文章索引

    最近这段时间趁天翼云1元主机活动,购买了一个1元主机,主要是为了写一些服务器配置的教程. 已经完成如下几篇文章,送给大家. 国内云主机比较 天翼云/阿里云/腾讯云 Windows Server 200 ...

  4. boa + ajax + cgi ajax请求cgi

    最近公司要做一个通讯管理机,然后需要和另外一个同事一起做,我们需要用到boa+Ajax+CGI,以前没试过与CGI交互,一开始发现问题挺大的,用ajax请求cgi,总是不返回数据,又或者请求回来的是c ...

  5. Shell脚本一枚

    脚本如下: #!/bin/bash dir=$1 dir1="" for file in `find $dir -type f` do dir2=${file%/*} name=$ ...

  6. CSS兼容各浏览器的hack

    CSS兼容各浏览器的hack:建议:尽可能的手写代码,可以有效的提高学习效率和深度.浏览器的种类多,麻烦自然也多,主要是各种浏览器对某些属性的渲染效果并不相同,所以有时候需要专门针对特定浏览器或者特定 ...

  7. Java多线程系列--“JUC锁”02之 互斥锁ReentrantLock

    本章对ReentrantLock包进行基本介绍,这一章主要对ReentrantLock进行概括性的介绍,内容包括:ReentrantLock介绍ReentrantLock函数列表ReentrantLo ...

  8. 云计算之路-阿里云上:从ASP.NET线程角度对“黑色30秒”问题的全新分析

    在这篇博文中,我们抛开对阿里云的怀疑,完全从ASP.NET的角度进行分析,看能不能找到针对问题现象的更合理的解释. “黑色30秒”问题现象的主要特征是:排队的请求(Requests Queued)突增 ...

  9. 1Z0-053 争议题目解析481

    1Z0-053 争议题目解析481 考试科目:1Z0-053 题库版本:V13.02 题库中原题为: 481.Which statement is true about a running sessi ...

  10. 遍历迭代map的集中方法

    public static void main(String[] args) { Map<String, String> map = new HashMap<String, Stri ...